{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "3e0bc7c8-7e84-4301-aae0-976639e1c73c",
   "metadata": {},
   "source": [
    "## 1.1读取所有标签\n",
    "\n",
    "- 图片分析\n",
    "    - 分析有多少张图片\n",
    "    - 分析图片大小分布\n",
    "- 样本类别分析\n",
    "    - 分析有多少个类别\n",
    "    - 分析样本大小分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "b77a9806-2b43-43b5-aaaf-3f89ff003cb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import xml.etree.ElementTree as ET\n",
    "import pandas as pd\n",
    "from PIL import Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5630d1c6-6206-4702-9c30-dea49e090b43",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{0: 'A330',\n",
       " 1: 'A320/321',\n",
       " 2: 'A220',\n",
       " 3: 'ARJ21',\n",
       " 4: 'Boeing737',\n",
       " 5: 'Boeing787',\n",
       " 6: 'other'}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "label2idx = {\"A330\": 0, \n",
    "             \"A320/321\": 1, \n",
    "             \"A220\": 2, \n",
    "             \"ARJ21\": 3, \n",
    "             \"Boeing737\": 4, \n",
    "             \"Boeing787\": 5, \n",
    "             \"other\": 6}\n",
    "idx2label = {idx: label for label, idx in label2idx.items()}\n",
    "idx2label"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "1f3dc245-2602-4153-8f1d-2275b1024317",
   "metadata": {},
   "outputs": [],
   "source": [
    "def parse_xml(xml_path):\n",
    "    \"\"\"\n",
    "    解析单个XML文件，返回一个字典列表，每个字典代表一个对象。\n",
    "    同时读取图像的宽度和高度。\n",
    "    \"\"\"\n",
    "    tree = ET.parse(xml_path)\n",
    "    root = tree.getroot()\n",
    "    \n",
    "    # 获取图像文件名\n",
    "    image_filename = os.path.basename(xml_path).replace('.xml', '.jpg')\n",
    "    image_relative_path = os.path.join(images_dir, image_filename)\n",
    "    \n",
    "    # 读取图像的宽度和高度\n",
    "    size = root.find('size')\n",
    "    width = int(size.find('width').text)\n",
    "    height = int(size.find('height').text)\n",
    "    \n",
    "    objects = []\n",
    "    for obj in root.findall('object'):\n",
    "        name = obj.find('name').text\n",
    "        bndbox = obj.find('bndbox')\n",
    "        xmin = int(bndbox.find('xmin').text)\n",
    "        ymin = int(bndbox.find('ymin').text)\n",
    "        xmax = int(bndbox.find('xmax').text)\n",
    "        ymax = int(bndbox.find('ymax').text)\n",
    "        \n",
    "        # 计算框的宽度、高度和中心点坐标\n",
    "        box_width = xmax - xmin\n",
    "        box_height = ymax - ymin\n",
    "        center_x = (xmin + xmax) / 2\n",
    "        center_y = (ymin + ymax) / 2\n",
    "        \n",
    "        # 获取类别ID\n",
    "        cls_id = label2idx.get(name, label2idx['other'])  # 如果类别不在字典中，默认为'other'\n",
    "        \n",
    "        objects.append({\n",
    "            'filename': image_filename,\n",
    "            'image_relative_path': image_relative_path,\n",
    "            'image_width': width,\n",
    "            'image_height': height,\n",
    "            'class': name,\n",
    "            'cls_id': cls_id,\n",
    "            'xmin': xmin,\n",
    "            'ymin': ymin,\n",
    "            'xmax': xmax,\n",
    "            'ymax': ymax,\n",
    "            'box_width': box_width,\n",
    "            'box_height': box_height,\n",
    "            'center_x': center_x,\n",
    "            'center_y': center_y\n",
    "        })\n",
    "    \n",
    "    return objects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7ec4a757-569c-4810-8c89-38b5f912bdf1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def read_all_labels(annotations_dir, images_dir):\n",
    "    \"\"\"\n",
    "    遍历指定目录下的所有XML文件，解析标签信息，并返回一个Pandas DataFrame。\n",
    "    \"\"\"\n",
    "    all_objects = []\n",
    "    \n",
    "    # 遍历指定目录下的所有文件\n",
    "    for filename in os.listdir(annotations_dir):\n",
    "        if filename.endswith('.xml'):\n",
    "            xml_path = os.path.join(annotations_dir, filename)\n",
    "            objects = parse_xml(xml_path)\n",
    "            all_objects.extend(objects)\n",
    "    \n",
    "    # 创建DataFrame\n",
    "    df = pd.DataFrame(all_objects)\n",
    "    return df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3157d0ec-a5c0-4489-91c9-979fc44aa603",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      filename                           image_relative_path  image_width  \\\n",
      "0  0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
      "1  0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
      "2  0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
      "3  0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
      "4  0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
      "\n",
      "   image_height      class  cls_id  xmin  ymin  xmax  ymax  box_width  \\\n",
      "0          1500  Boeing787       5   459  1433   536  1499         77   \n",
      "1          1500  Boeing737       4   988  1426  1064  1499         76   \n",
      "2          1200  Boeing787       5   713   777   772   829         59   \n",
      "3          1200       A220       2  1072   461  1153   545         81   \n",
      "4          1200       A220       2   956   464  1038   555         82   \n",
      "\n",
      "   box_height  center_x  center_y  \n",
      "0          66     497.5    1466.0  \n",
      "1          73    1026.0    1462.5  \n",
      "2          52     742.5     803.0  \n",
      "3          84    1112.5     503.0  \n",
      "4          91     997.0     509.5  \n"
     ]
    }
   ],
   "source": [
    "# 指定包含标签文件和图片文件的目录\n",
    "annotations_dir = os.path.join('.', 'sar_aircraft_source', 'Annotations')\n",
    "images_dir = os.path.join('.', 'sar_aircraft_source', 'JPEGImages')\n",
    "\n",
    "# 读取所有标签信息到DataFrame\n",
    "df_labels = read_all_labels(annotations_dir, images_dir)\n",
    "\n",
    "# 显示前几行数据\n",
    "print(df_labels.head())\n",
    "\n",
    "# 保存到CSV文件\n",
    "df_labels.to_csv('labels_with_dimensions_and_cls_id.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4e9f1411-e9dd-4db9-9ad5-db366b699d4a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "other        4264\n",
       "A220         3730\n",
       "Boeing787    2645\n",
       "Boeing737    2557\n",
       "A320/321     1771\n",
       "ARJ21        1187\n",
       "A330          309\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别的数量\n",
    "df_labels['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "64751692-689d-48b0-97f6-43ff156180f8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6    4264\n",
       "2    3730\n",
       "5    2645\n",
       "4    2557\n",
       "1    1771\n",
       "3    1187\n",
       "0     309\n",
       "Name: cls_id, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别ID的数量\n",
    "df_labels['cls_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c1b6d7fe-1c5f-47ec-8080-5152b5fdfa87",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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I0bozjvvVPPmzd3L+/btq+joaEVGRmr37t0aM2aMDhw4oPfff1+SlJOT4xFeJLnnc3JyrtjH5XLp3LlzCgwMvKyesWPHKiUlxT3vcrkIMQAAVFJXHWCSk5P19ddf69NPP/VYPmTIEPfPLVq0UL169dSpUycdPnxYN99889VX+iscDoccDkeFrR8AAHiPqzqFNHz4cK1Zs0abN29W/fr1r9i3bdu2kqRDhw5JkiIiIpSbm+vR59L8petmyurjdDpLPfoCAACqlnIFGGOMhg8frpUrV2rTpk1q2LDhr34mKytLklSvXj1JUlxcnPbs2aO8vDx3n7S0NDmdTsXExLj7pKene6wnLS1NcXFx5SkXAABUUuUKMMnJyfr73/+uZcuWqVatWsrJyVFOTo7OnTsnSTp8+LAmT56szMxMHT16VKtWrdKAAQPUvn17tWzZUpLUuXNnxcTEqH///tq1a5fWr1+vcePGKTk52X0KaOjQofr22281evRo7d+/X6+99prefvttjRw58hpvPgAAsKNyBZi5c+fq1KlT6tChg+rVq+eeVqxYIUkKCAjQxo0b1blzZzVt2lRPPvmkevbsqdWrV7vX4efnpzVr1sjPz09xcXH605/+pAEDBmjSpEnuPg0bNtTatWuVlpamVq1aafr06Zo/f36Zt1ADAICqpVwX8RpjrtgeFRWlrVu3/up6oqOj9dFHH12xT4cOHfTVV1+VpzwAAFBF8DJHAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgOwQYAABgO+UKMFOmTNHvf/971apVS2FhYerRo4cOHDjg0ef8+fNKTk5WaGioatasqZ49eyo3N9ejT3Z2thITExUUFKSwsDCNGjVKFy9e9OizZcsWtWnTRg6HQ40aNVJqaurVbSEAAKh0yhVgtm7dquTkZH322WdKS0vThQsX1LlzZxUUFLj7jBw5UqtXr9Y777yjrVu36vjx43rwwQfd7cXFxUpMTFRRUZG2b9+uxYsXKzU1VePHj3f3OXLkiBITE9WxY0dlZWVpxIgRSkpK0vr166/BJgMAALvzL0/ndevWecynpqYqLCxMmZmZat++vU6dOqUFCxZo2bJluvfeeyVJixYtUrNmzfTZZ5+pXbt22rBhg/bt26eNGzcqPDxct912myZPnqwxY8ZowoQJCggI0Lx589SwYUNNnz5dktSsWTN9+umnmjFjhhISEq7RpgMAALv6TdfAnDp1SpJUp04dSVJmZqYuXLig+Ph4d5+mTZuqQYMGysjIkCRlZGSoRYsWCg8Pd/dJSEiQy+XS3r173X1+vo5LfS6tozSFhYVyuVweEwAAqJyuOsCUlJRoxIgRuvPOO9W8eXNJUk5OjgICAhQSEuLRNzw8XDk5Oe4+Pw8vl9ovtV2pj8vl0rlz50qtZ8qUKQoODnZPUVFRV7tpAADAy111gElOTtbXX3+t5cuXX8t6rtrYsWN16tQp93Ts2DGrSwIAABWkXNfAXDJ8+HCtWbNG27ZtU/369d3LIyIiVFRUpPz8fI+jMLm5uYqIiHD32bFjh8f6Lt2l9PM+v7xzKTc3V06nU4GBgaXW5HA45HA4rmZzAACAzZTrCIwxRsOHD9fKlSu1adMmNWzY0KM9NjZW1apVU3p6unvZgQMHlJ2drbi4OElSXFyc9uzZo7y8PHeftLQ0OZ1OxcTEuPv8fB2X+lxaBwAAqNrKdQQmOTlZy5Yt04cffqhatWq5r1kJDg5WYGCggoODNXjwYKWkpKhOnTpyOp16/PHHFRcXp3bt2kmSOnfurJiYGPXv31/Tpk1TTk6Oxo0bp+TkZPcRlKFDh+rVV1/V6NGjNWjQIG3atElvv/221q5de403HwAA2FG5jsDMnTtXp06dUocOHVSvXj33tGLFCnefGTNm6P7771fPnj3Vvn17RURE6P3333e3+/n5ac2aNfLz81NcXJz+9Kc/acCAAZo0aZK7T8OGDbV27VqlpaWpVatWmj59uubPn88t1AAAQFI5j8AYY361T/Xq1TVnzhzNmTOnzD7R0dH66KOPrrieDh066KuvvipPeQAAoIrgXUgAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2CDAAAMB2yvUyRwBAxbnx6bVWl+B2dGqi1SUAV8QRGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDsEGAAAYDvlDjDbtm1Tt27dFBkZKR8fH33wwQce7Y888oh8fHw8pi5dunj0OXnypPr16yen06mQkBANHjxYZ86c8eize/du3X333apevbqioqI0bdq08m8dAAColModYAoKCtSqVSvNmTOnzD5dunTR999/757eeustj/Z+/fpp7969SktL05o1a7Rt2zYNGTLE3e5yudS5c2dFR0crMzNTL774oiZMmKA33nijvOUCAIBKyL+8H+jatau6du16xT4Oh0MRERGltn3zzTdat26ddu7cqdtvv12SNHv2bN1333166aWXFBkZqaVLl6qoqEgLFy5UQECAbr31VmVlZenll1/2CDoAAKBqqpBrYLZs2aKwsDA1adJEw4YN048//uhuy8jIUEhIiDu8SFJ8fLx8fX31+eefu/u0b99eAQEB7j4JCQk6cOCA/v3vf5f6nYWFhXK5XB4TAAConK55gOnSpYv+9re/KT09XS+88IK2bt2qrl27qri4WJKUk5OjsLAwj8/4+/urTp06ysnJcfcJDw/36HNp/lKfX5oyZYqCg4PdU1RU1LXeNAAA4CXKfQrp1/Tu3dv9c4sWLdSyZUvdfPPN2rJlizp16nStv85t7NixSklJcc+7XC5CDAAAlVSF30Z90003qW7dujp06JAkKSIiQnl5eR59Ll68qJMnT7qvm4mIiFBubq5Hn0vzZV1b43A45HQ6PSYAAFA5VXiA+b//+z/9+OOPqlevniQpLi5O+fn5yszMdPfZtGmTSkpK1LZtW3efbdu26cKFC+4+aWlpatKkiWrXrl3RJQMAAC9X7gBz5swZZWVlKSsrS5J05MgRZWVlKTs7W2fOnNGoUaP02Wef6ejRo0pPT1f37t3VqFEjJSQkSJKaNWumLl266LHHHtOOHTv0j3/8Q8OHD1fv3r0VGRkpSerbt68CAgI0ePBg7d27VytWrNCsWbM8ThEBAICqq9wB5osvvlDr1q3VunVrSVJKSopat26t8ePHy8/PT7t379YDDzygW265RYMHD1ZsbKw++eQTORwO9zqWLl2qpk2bqlOnTrrvvvt01113eTzjJTg4WBs2bNCRI0cUGxurJ598UuPHj+cWagAAIOkqLuLt0KGDjDFltq9fv/5X11GnTh0tW7bsin1atmypTz75pLzlAQCAKoB3IQEAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANshwAAAANvxt7oAAAB+zY1Pr7W6BLejUxOtLgHiCAwAALAhAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALAdAgwAALCdcgeYbdu2qVu3boqMjJSPj48++OADj3ZjjMaPH6969eopMDBQ8fHxOnjwoEefkydPql+/fnI6nQoJCdHgwYN15swZjz67d+/W3XffrerVqysqKkrTpk0r/9YBAIBKqdwBpqCgQK1atdKcOXNKbZ82bZpeeeUVzZs3T59//rlq1KihhIQEnT9/3t2nX79+2rt3r9LS0rRmzRpt27ZNQ4YMcbe7XC517txZ0dHRyszM1IsvvqgJEybojTfeuIpNBAAAlU2530bdtWtXde3atdQ2Y4xmzpypcePGqXv37pKkv/3tbwoPD9cHH3yg3r1765tvvtG6deu0c+dO3X777ZKk2bNn67777tNLL72kyMhILV26VEVFRVq4cKECAgJ06623KisrSy+//LJH0Pm5wsJCFRYWuuddLld5Nw0AANjENb0G5siRI8rJyVF8fLx7WXBwsNq2bauMjAxJUkZGhkJCQtzhRZLi4+Pl6+urzz//3N2nffv2CggIcPdJSEjQgQMH9O9//7vU754yZYqCg4PdU1RU1LXcNAAA4EWuaYDJycmRJIWHh3ssDw8Pd7fl5OQoLCzMo93f31916tTx6FPaOn7+Hb80duxYnTp1yj0dO3bst28QAADwSuU+heStHA6HHA6H1WUAAIDr4JoegYmIiJAk5ebmeizPzc11t0VERCgvL8+j/eLFizp58qRHn9LW8fPvAAAAVdc1DTANGzZURESE0tPT3ctcLpc+//xzxcXFSZLi4uKUn5+vzMxMd59NmzappKREbdu2dffZtm2bLly44O6TlpamJk2aqHbt2teyZAAAYEPlDjBnzpxRVlaWsrKyJP104W5WVpays7Pl4+OjESNG6Pnnn9eqVau0Z88eDRgwQJGRkerRo4ckqVmzZurSpYsee+wx7dixQ//4xz80fPhw9e7dW5GRkZKkvn37KiAgQIMHD9bevXu1YsUKzZo1SykpKddswwEAgH2V+xqYL774Qh07dnTPXwoVAwcOVGpqqkaPHq2CggINGTJE+fn5uuuuu7Ru3TpVr17d/ZmlS5dq+PDh6tSpk3x9fdWzZ0+98sor7vbg4GBt2LBBycnJio2NVd26dTV+/Pgyb6EGAABVS7kDTIcOHWSMKbPdx8dHkyZN0qRJk8rsU6dOHS1btuyK39OyZUt98skn5S0PAABUAbwLCQAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2A4BBgAA2M41DzATJkyQj4+Px9S0aVN3+/nz55WcnKzQ0FDVrFlTPXv2VG5ursc6srOzlZiYqKCgIIWFhWnUqFG6ePHitS4VAADYlH9FrPTWW2/Vxo0b//Ml/v/5mpEjR2rt2rV65513FBwcrOHDh+vBBx/UP/7xD0lScXGxEhMTFRERoe3bt+v777/XgAEDVK1aNf31r3+tiHIBAIDNVEiA8ff3V0RExGXLT506pQULFmjZsmW69957JUmLFi1Ss2bN9Nlnn6ldu3basGGD9u3bp40bNyo8PFy33XabJk+erDFjxmjChAkKCAioiJIBAICNVMg1MAcPHlRkZKRuuukm9evXT9nZ2ZKkzMxMXbhwQfHx8e6+TZs2VYMGDZSRkSFJysjIUIsWLRQeHu7uk5CQIJfLpb1795b5nYWFhXK5XB4TAAConK55gGnbtq1SU1O1bt06zZ07V0eOHNHdd9+t06dPKycnRwEBAQoJCfH4THh4uHJyciRJOTk5HuHlUvultrJMmTJFwcHB7ikqKurabhgAAPAa1/wUUteuXd0/t2zZUm3btlV0dLTefvttBQYGXuuvcxs7dqxSUlLc8y6XixADAEAlVeG3UYeEhOiWW27RoUOHFBERoaKiIuXn53v0yc3NdV8zExERcdldSZfmS7uu5hKHwyGn0+kxAQCAyqnCA8yZM2d0+PBh1atXT7GxsapWrZrS09Pd7QcOHFB2drbi4uIkSXFxcdqzZ4/y8vLcfdLS0uR0OhUTE1PR5QIAABu45qeQnnrqKXXr1k3R0dE6fvy4nnvuOfn5+alPnz4KDg7W4MGDlZKSojp16sjpdOrxxx9XXFyc2rVrJ0nq3LmzYmJi1L9/f02bNk05OTkaN26ckpOT5XA4rnW5AADAhq55gPm///s/9enTRz/++KNuuOEG3XXXXfrss890ww03SJJmzJghX19f9ezZU4WFhUpISNBrr73m/ryfn5/WrFmjYcOGKS4uTjVq1NDAgQM1adKka10qAACwqWseYJYvX37F9urVq2vOnDmaM2dOmX2io6P10UcfXevSAABAJcG7kAAAgO0QYAAAgO0QYAAAgO0QYAAAgO0QYAAAgO0QYAAAgO0QYAAAgO0QYAAAgO1c8wfZAQCA6+fGp9daXYLb0amJ1+27OAIDAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABsx6sDzJw5c3TjjTeqevXqatu2rXbs2GF1SQAAwAt4bYBZsWKFUlJS9Nxzz+nLL79Uq1atlJCQoLy8PKtLAwAAFvPaAPPyyy/rscce06OPPqqYmBjNmzdPQUFBWrhwodWlAQAAi/lbXUBpioqKlJmZqbFjx7qX+fr6Kj4+XhkZGaV+prCwUIWFhe75U6dOSZJcLtdvrqek8OxvXse1ci2251rxpnGRGJsrYWzKxtiUzpvGRWJsrqSyjc2ldRhjrtzReKF//etfRpLZvn27x/JRo0aZO+64o9TPPPfcc0YSExMTExMTUyWYjh07dsWs4JVHYK7G2LFjlZKS4p4vKSnRyZMnFRoaKh8fHwsr+ylNRkVF6dixY3I6nZbW4m0Ym7IxNmVjbMrG2JSNsSmdt42LMUanT59WZGTkFft5ZYCpW7eu/Pz8lJub67E8NzdXERERpX7G4XDI4XB4LAsJCamoEq+K0+n0in8c3oixKRtjUzbGpmyMTdkYm9J507gEBwf/ah+vvIg3ICBAsbGxSk9Pdy8rKSlRenq64uLiLKwMAAB4A688AiNJKSkpGjhwoG6//XbdcccdmjlzpgoKCvToo49aXRoAALCY1waYhx9+WCdOnND48eOVk5Oj2267TevWrVN4eLjVpZWbw+HQc889d9kpLjA2V8LYlI2xKRtjUzbGpnR2HRcfY37tPiUAAADv4pXXwAAAAFwJAQYAANgOAQYAANgOAQYAANgOAQYAANgOAaYCXLhwQf7+/vr666+tLgUAgErJa58DY2fVqlVTgwYNVFxcbHUpXuWHH37QwoULlZGRoZycHElSRESE/vCHP+iRRx7RDTfcYHGFQOWRm5ur119/XePHj7e6FK9T1cemsuyLeQ5MBVmwYIHef/99LVmyRHXq1LG6HMvt3LlTCQkJCgoKUnx8vPuBhLm5uUpPT9fZs2e1fv163X777RZXao333ntPXbt2VVBQkNWleJ3MzEzFxsZaXYbt7Nq1S23atOE/UqWoymNTmfbFBJgK0rp1ax06dEgXLlxQdHS0atSo4dH+5ZdfWlSZNdq1a6dWrVpp3rx5l70d3BijoUOHavfu3crIyLCoQmv5+vqqVq1aevjhhzV48GC1bdvW6pK8hq+vr2666SYNGjRIjzzyyK++obaq2L179xXb9+/frz59+lTJP9KMTdkq076YAFNBJk6ceMX255577jpV4h0CAwP11VdfqWnTpqW279+/X61bt9a5c+euc2XewdfXVxMnTtTKlSuVlZWlmJgYJSUlqX///goNDbW6PEv5+voqKSlJH374oU6ePKmEhAQlJSWpW7du8vPzs7o8y/j6+srHx0el7cIvLffx8amSf6QZm7JVqn2xAa6DG2+80SxevLjM9sWLF5vo6OjrV5CX8fHxMbm5ucYYY7744gszbNgwExISYhwOh/mf//kfs2HDBosrtM6lsblw4YJ59913zX333Wf8/PxMeHi4GT16tDlw4IDVJVoiNDTULFiwwBw9erTUae3atcbX19fqMi3B2JStMu2LuYi3AuXn5+vdd9/V4cOHNWrUKNWpU0dffvmlwsPD9bvf/c7q8q6rp556SkOGDFFmZqY6dep02XnXN998Uy+99JLFVXqH2NhYxcbG6uWXX9Y777yjhQsXqkuXLmrQoIGOHDlidXmW8ff3V8+ePdWzZ0/961//0sKFC5WamqqXXnpJd955p7Zt22Z1iddVbGysjh8/rujo6FLb8/PzSz0CURUwNmWrVPtiqxNUZbVr1y5zww03mEaNGhl/f39z+PBhY4wxzz77rOnfv7/F1Vlj+fLlpm3btsbf39/4+PgYHx8f4+/vb9q2bWtWrFhhdXmW8vX1dR+BKc3BgwfNM888cx0r8h6/NjYbN240ffv2vY4VeYf333/fLFmypMz2kydPmtTU1OtYkfdgbK6ssuyLuQamgsTHx6tNmzaaNm2aatWqpV27dummm27S9u3b1bdvXx09etTqEi1z4cIF/fDDD5KkunXrqlq1ahZXZD1fX1/l5OQoLCzM6lK8DmMDVAy774s5hVRBdu7cqddff/2y5b/73e/c991XVdWqVVO9evWsLsOrHDlyRHXr1rW6DK+0efNmHkUAVAC774t5Em8FcTgccrlcly3/5z//aZuHBF1ru3bt0vPPP6/XXnvNnfovcblcGjRokEWVWS86Olq+vvw6luaee+6Rvz//1yrN999/r7///e/66KOPVFRU5NFWUFCgSZMmWVSZ9Ribss2fP18DBw7UokWLJEkrVqxQs2bNdNNNN9nrDlmrz2FVVoMHDzY9evQwRUVFpmbNmubbb7813333nWndurX53//9X6vLu+7Wr19vAgICzK233moaNGhgQkNDzaZNm9ztOTk5VfaugEtWr15t/t//+3/m008/NcYYk56ebrp27WoSEhLM66+/bnF11vrhhx/Mpk2bzI8//miMMebEiRNm6tSpZuLEiWbfvn0WV2eNHTt2mJCQEON0Ok1gYKBp1KiR+frrr93tVfl3irEp24wZM0yNGjXMgw8+aOrVq2eef/55Exoaap5//nkzceJE43Q6bbO/IcBUkPz8fBMfH29CQkKMn5+fiYqKMtWqVTPt27c3Z86csbq86y4uLs59EWpJSYl54YUXTM2aNc3HH39sjKnaOxRjjJk3b57x9/c3sbGxxul0miVLlphatWqZpKQk8+c//9kEBgaamTNnWl2mJT7//HMTHBxsfHx8TO3atc0XX3xhGjZsaBo3bmxuvvlmExgYaDIzM60u87qLj483jz76qCkuLjYul8sMGzbMhIaGmi+//NIYU7V/pxibsjVt2tQsXbrUGGPMl19+afz9/c38+fPd7fPnzzexsbFWlVcuBJgK9sknn5g5c+aYF154waSlpVldjmWcTqc5dOiQx7KlS5eaGjVqmNWrV1fpHYoxxsTExJg33njDGGPMpk2bTPXq1c2cOXPc7YsWLTLNmjWzqjxLxcfHm6SkJONyucyLL75o6tevb5KSktztjz76qOnRo4eFFVqjdu3alz0DZ8qUKaZ27dpmx44dVfp3irEpW2BgoPnuu+/c8w6Hw+Po1MGDB01ISIgVpZUbAQbXxQ033GC++OKLy5a/9dZbJigoyMydO7fK7lCMuXynUq1aNbNnzx73/JEjR0xQUJAVpVmudu3a7tNERUVFxtfX13z++efu9szMTPO73/3OqvIsU7t2bbNr167Llr/44osmJCTEvP/++1X2d4qxKVtoaKjHadf69eubo0ePuucPHjxoatasaUVp5caVcRUoPT1d6enpysvLU0lJiUfbwoULLarKGrfddps2b9582Uv5evfuLWOMBg4caFFl3iE0NFTfffedGjRooOPHj+vixYvKzs5W8+bNJUnfffddlb0Tp6ioSIGBgZJ+umsiKCjI446tunXr6scff7SqPMs0b95c27dvV8uWLT2WP/XUUyopKVGfPn0sqsx6jE3ZmjZtqt27d6tZs2aSpGPHjnm079+/XzfeeKMFlZUfAaaCTJw4UZMmTdLtt9+uevXqXfbSrKpm2LBhZT4ptU+fPjLG6M0337zOVXmP7t27a/DgwRo4cKBWrVqlAQMG6Mknn3S/02XUqFHq3Lmz1WVaIioqSt9++617p7p8+XKPWz+///77KnkL+oABA7R161YNHTr0srbRo0fLGKN58+ZZUJn1GJuyvfDCC5e9XPjnsrOz9ec///k6VnT1eJBdBalXr56mTZum/v37W10KbKCgoEAjR45URkaG/vCHP2j27Nl65ZVX9Oyzz+rChQu65557tGLFiir5MLeJEyeqSZMm6t27d6ntzz77rPbv36/33nvvOlcGwEoEmAoSGhqqHTt26Oabb7a6FNjY+fPndeHCBdWqVcvqUrzW2bNn5efnJ4fDYXUpXsEYo5KSkir9pm6UX25urgoLC9WgQQOrS/mv8eSsCpKUlKRly5ZZXYZXee211xQfH69evXopPT3do+2HH37QTTfdZFFl3qt69eqEl18RFBRUJcPLxYsXNW7cON1zzz3uh4+9+OKLqlmzpoKCgjRw4MDLHuBWVbRu3Vpt2rS54nTHHXfogQce0OzZs6vUOJ0+fVp/+tOfFB0d7f43kpycrHr16qlhw4a65557Sn0IqzfiGphrKCUlxf1zSUmJ3njjDW3cuFEtW7a87B0TL7/88vUuz1KvvPKKxo4dq0cffVSnTp3SfffdpwkTJmjs2LGSpOLiYn333XcWV2mdbt26qVevXnrooYfcF6ziJ4xN6SZOnKj58+erX79+evfdd5WXl6e1a9fqjTfeUHFxsZ555hnNnDlTo0ePtrrU665Hjx6/2qekpER5eXl6/vnn9c033+i1116r+MK8wDPPPKPMzEw99dRTev/999WrVy8dPnxYn3zyiYqLizVs2DC98MIL+stf/mJ1qb+KU0jXUMeOHf/rvps3b67ASrzPrbfeqmeffVZ9+/aVJG3fvl09evTQ0KFDNWnSJOXm5ioyMlLFxcUWV2oNX19f+fn5qUaNGurTp4+SkpIuu2OrqmJsSnfzzTdr1qxZuv/++3Xo0CE1adJEy5Yt08MPPyxJevvttzV58mTt2bPH4kq927Zt29SrV68q8466Bg0aaPHixerYsaOOHz+u+vXra9WqVbr//vslSWvXrtWTTz6p/fv3W1zpf8Gi27dRxQQGBpojR454LNuzZ48JDw83Tz/9dJV+sJQxxvj4+Ji9e/eaGTNmmBYtWhhfX1/TqlUrM3v2bHPy5Emry7MUY1O66tWrm+zsbI/5b775xj3/7bffmlq1allRmtc7d+6cefHFF40xxpw+fdqMHDnS4oquH4fD4fHvJigoyOOhf0ePHrXNM6e4BqaCDBo0SKdPn75seUFBQZV8aWHdunUve95A8+bNtWnTJi1atKhKHub+pbp162rEiBHavXu3MjIy1LZtW40bN06/+93v1LdvX23atMnqEi3D2FwuODhY+fn57vk2bdp4XC9VWFhYpR/fcOLECa1Zs0YbNmxwH9m9cOGCZs2apRtvvFFTp06VJNWsWbNKndIPDQ3ViRMn3PPdu3dXSEiIe/7MmTP2uabM6gRVWfn6+prc3NzLlp84ccL4+flZUJG1+vTpY0aMGFFq29dff21uuOGGKn8EprR/LwUFBWbRokXmrrvuqrLjw9iUrmPHjiY1NbXM9rfffts277S51j755BP3+7N8fX3NHXfcYfbu3WsaN25smjVrZubOnWvOnj1rdZmW6NKli5k3b16Z7YsWLTJ/+MMfrmNFV49rYK4xl8slY4xq166tgwcP6oYbbnC3FRcXa/Xq1Xr66ad1/PhxC6u8/nbv3q3MzEw9+uijpbbv3btXzz33nN59993rXJl38PX1VU5OzhWf8/LPf/5Tt9xyy3WsyjswNqX75z//qWrVqqlhw4alti9btkz+/v7q1avXda7Meh06dFBkZKSeeeYZLV68WNOnT1fjxo31l7/8RQ899JDV5Vnq5MmT8vX19Tjq8nMff/yxDh06pMcff/z6FnYVCDDX2KUnp5bFx8dHEydO1LPPPnsdq/Jep0+f1ltvvaX58+crMzOzyl7E27FjR61cubLMnUpVxtiUbtOmTbrnnnt43kspQkND9cknnygmJkbnzp1TzZo19f7776t79+5Wl+a17LgvJsBcY1u3bpUxRvfee6/ee+89j/fXBAQEKDo6WpGRkRZW6B22bdumBQsW6L333lNkZKQefPBB9ezZU7///e+tLg2whZtuukn5+fnq0qWLunfvrq5du8rpdFpdllf45VG7WrVqKSsriweLlsLO+2KeA3ON3XPPPZKkI0eOyOl0auHChfrmm28k/XQrcUxMjJXlWSonJ0epqalasGCBXC6XevXqpcLCQn3wwQdVelyAq/Htt99q9+7dWrVqlaZPn65HHnlEd911lx544AF1797dVk9UrQj79u1z3xptjNGBAwdUUFDg0eeXL3usKirLvpgjMBXkiy++UJcuXVS9enXdcccdkqSdO3fq3Llz2rBhg9q0aWNxhddXt27dtG3bNiUmJqpfv37q0qWL/Pz8VK1aNe3atctWvzQVqXXr1qWegvTx8VH16tXVqFEjPfLII+V65lBlwdhc2fHjx7Vq1SqtWrVKmzdvVpMmTfTAAw/ogQce0O233251edfVpVP5V/rz5uPjY4vTJNdaZdoXE2AqyN13361GjRrpzTfflL//Twe6Ll68qKSkJH377bdlvpm5svL399cTTzyhYcOGqXHjxu7ldvylqUhjx47V3Llz1aJFC4/gu3v3bj3yyCPat2+f0tPTq+T5fMbmv1dQUKB169bpww8/1EcffaSUlBQ988wzVpd13fw3T/U+ffq0mjdvfh2q8S6Val9sxa1PVcEvHyp1yd69e01gYKAFFVkrIyPDJCUlmVq1apk77rjDzJ4925w4ccL4+/ubvXv3Wl2e10hKSjKTJk26bPnkyZNNUlKSMcaY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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 不同类别的分布情况\n",
    "import matplotlib.pyplot as plt\n",
    "df_labels['class'].value_counts().plot(kind='bar')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c01aead5-0927-457b-8190-23a4939a91a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAIDCAYAAADlvQGOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAABoNUlEQVR4nO3deVQV9f8/8Odlu6wXEGULRBQVUHFBU9RcEkUkl5/2Mc0UFzQMNaHUKHczTVNccqkUMZNcyn1DBJdMTCUR1CQxFA2BlOAiKiDM7w8P8+0GKBowF+b5OGfOceb9vnNfM8Hl2dz3vEchCIIAIiIiIhnTkboAIiIiIqkxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQEdURc+fOhUKhqJH36tGjB3r06CGunzhxAgqFAj/88EONvP/o0aPRqFGjGnmvl/XgwQMEBATA1tYWCoUCU6dOrZL9RkREQKFQ4ObNm1WyPyJ6ioGISAuV/tErXQwNDWFvbw8fHx+sWrUKeXl5VfI+6enpmDt3LhISEqpkf1VJm2urjM8++wwRERGYOHEitmzZgpEjRz6zf3FxMTZt2oQePXqgXr16UCqVaNSoEcaMGYMLFy7UUNVE8qUndQFEVLH58+fD2dkZRUVFyMjIwIkTJzB16lQsX74c+/btg4eHh9h35syZ+Oijj15o/+np6Zg3bx4aNWqENm3aVPp1R48efaH3eRnPqu2bb75BSUlJtdfwX8TGxqJTp06YM2fOc/s+evQIgwcPxpEjR9CtWzd8/PHHqFevHm7evIkdO3Zg8+bNSEtLg4ODQw1UTiRPDEREWszX1xft27cX10NDQxEbG4s33ngDAwYMwG+//QYjIyMAgJ6eHvT0qvdX+uHDhzA2NoaBgUG1vs/z6OvrS/r+lZGVlQV3d/dK9Z02bRqOHDmCsLCwMl+tzZkzB2FhYdVQIRH9E78yI6plXn/9dcyaNQu3bt3Cd999J24vbwxRdHQ0unbtCgsLC5iamqJ58+b4+OOPATwd99OhQwcAwJgxY8Sv5yIiIgA8HSfUsmVLxMfHo1u3bjA2NhZf++8xRKWKi4vx8ccfw9bWFiYmJhgwYABu376t0adRo0YYPXp0mdf+c5/Pq628MUT5+fn44IMP4OjoCKVSiebNm+OLL76AIAga/RQKBSZNmoQ9e/agZcuWUCqVaNGiBY4cOVL+Cf+XrKwsjBs3DjY2NjA0NETr1q2xefNmsb10PFVqaioOHjwo1l7RmJ87d+7gq6++Qu/evcsdZ6Srq4sPP/zwmVeH9u7dCz8/P9jb20OpVKJJkyZYsGABiouLNfpdv34dQ4YMga2tLQwNDeHg4IBhw4YhNzdX7POsn5lSBQUFmDNnDlxcXKBUKuHo6Ijp06ejoKBAo19l9kWkLXiFiKgWGjlyJD7++GMcPXoU48ePL7fPlStX8MYbb8DDwwPz58+HUqlESkoKfv75ZwCAm5sb5s+fj9mzZ2PChAl47bXXAACdO3cW93H//n34+vpi2LBheOedd2BjY/PMuhYuXAiFQoEZM2YgKysLK1asgLe3NxISEsQrWZVRmdr+SRAEDBgwAMePH8e4cePQpk0bREVFYdq0afjzzz/LXGE5ffo0du3ahffeew9mZmZYtWoVhgwZgrS0NFhZWVVY16NHj9CjRw+kpKRg0qRJcHZ2xs6dOzF69Gjk5OTg/fffh5ubG7Zs2YLg4GA4ODjggw8+AAA0aNCg3H0ePnwYT548ee4Yo2eJiIiAqakpQkJCYGpqitjYWMyePRtqtRpLly4FABQWFsLHxwcFBQWYPHkybG1t8eeff+LAgQPIycmBubn5c39mAKCkpAQDBgzA6dOnMWHCBLi5uSEpKQlhYWH4/fffsWfPHgDP//kj0joCEWmdTZs2CQCE8+fPV9jH3NxcaNu2rbg+Z84c4Z+/0mFhYQIA4a+//qpwH+fPnxcACJs2bSrT1r17dwGAsH79+nLbunfvLq4fP35cACC88sorglqtFrfv2LFDACCsXLlS3Obk5CT4+/s/d5/Pqs3f319wcnIS1/fs2SMAED799FONfm+++aagUCiElJQUcRsAwcDAQGPbpUuXBADC6tWry7zXP61YsUIAIHz33XfitsLCQsHLy0swNTXVOHYnJyfBz8/vmfsTBEEIDg4WAAgXL158bl9B+L+fjdTUVHHbw4cPy/R79913BWNjY+Hx48eCIAjCxYsXBQDCzp07K9x3ZX5mtmzZIujo6Ag//fSTxvb169cLAISff/650vsi0ib8yoyoljI1NX3m3WYWFhYAnn6d8rIDkJVKJcaMGVPp/qNGjYKZmZm4/uabb8LOzg6HDh16qfevrEOHDkFXVxdTpkzR2P7BBx9AEAQcPnxYY7u3tzeaNGkirnt4eEClUuGPP/547vvY2tpi+PDh4jZ9fX1MmTIFDx48wMmTJ1+4drVaDQAa5+1F/fPqW15eHu7du4fXXnsNDx8+xLVr1wAA5ubmAICoqCg8fPiw3P1U5mdm586dcHNzg6urK+7duycur7/+OgDg+PHjld4XkTZhICKqpR48ePDMP6JvvfUWunTpgoCAANjY2GDYsGHYsWPHC/1xeuWVV15oAHXTpk011hUKBVxcXKp9zpxbt27B3t6+zPlwc3MT2/+pYcOGZfZhaWmJv//++7nv07RpU+joaH50VvQ+laFSqQDgP02lcOXKFfy///f/YG5uDpVKhQYNGuCdd94BAHF8kLOzM0JCQrBhwwbUr18fPj4+WLNmjcb4ocr8zFy/fh1XrlxBgwYNNJZmzZoBeDrGqrL7ItImDEREtdCdO3eQm5sLFxeXCvsYGRnh1KlTOHbsGEaOHInExES89dZb6N27d5nBts/aR1WraPLIytZUFXR1dcvdLvxrAHZNcHV1BQAkJSW91OtzcnLQvXt3XLp0CfPnz8f+/fsRHR2Nzz//HAA0AsiyZcuQmJiIjz/+GI8ePcKUKVPQokUL3LlzB0DlfmZKSkrQqlUrREdHl7u89957ld4XkTZhICKqhbZs2QIA8PHxeWY/HR0d9OrVC8uXL8fVq1excOFCxMbGil9rVPXM1tevX9dYFwQBKSkpGneEWVpaIicnp8xr/3115UVqc3JyQnp6epmrLKVfFzk5OVV6X897n+vXr5e5yvFf3sfX1xe6uroadwy+iBMnTuD+/fuIiIjA+++/jzfeeAPe3t6wtLQst3+rVq0wc+ZMnDp1Cj/99BP+/PNPrF+/Xmx/3s9MkyZNkJ2djV69esHb27vM0rx580rvi0ibMBAR1TKxsbFYsGABnJ2dMWLEiAr7ZWdnl9lWOsFh6e3RJiYmAFBuQHkZ3377rUYo+eGHH3D37l34+vqK25o0aYKzZ8+isLBQ3HbgwIEyt+e/SG39+vVDcXExvvzyS43tYWFhUCgUGu//X/Tr1w8ZGRnYvn27uO3JkydYvXo1TE1N0b179xfep6OjI8aPH4+jR49i9erVZdpLSkqwbNky8SrOv5Ve7frn1a3CwkKsXbtWo59arcaTJ080trVq1Qo6Ojriz0NlfmaGDh2KP//8E998802Zvo8ePUJ+fn6l90WkTXjbPZEWO3z4MK5du4YnT54gMzMTsbGxiI6OhpOTE/bt2wdDQ8MKXzt//nycOnUKfn5+cHJyQlZWFtauXQsHBwd07doVwNNwYmFhgfXr18PMzAwmJibo2LEjnJ2dX6reevXqoWvXrhgzZgwyMzOxYsUKuLi4aEwNEBAQgB9++AF9+/bF0KFDcePGDXz33Xcag5xftLb+/fujZ8+e+OSTT3Dz5k20bt0aR48exd69ezF16tQy+35ZEyZMwFdffYXRo0cjPj4ejRo1wg8//ICff/4ZK1aseOmB0cuWLcONGzcwZcoU7Nq1C2+88QYsLS2RlpaGnTt34tq1axg2bFi5r+3cuTMsLS3h7++PKVOmQKFQYMuWLWW+/ouNjcWkSZPwv//9D82aNcOTJ0+wZcsW6OrqYsiQIQAq9zMzcuRI7NixA4GBgTh+/Di6dOmC4uJiXLt2DTt27EBUVBTat29fqX0RaRVJ73EjonKV3lpduhgYGAi2trZC7969hZUrV2rc3l3q37fdx8TECAMHDhTs7e0FAwMDwd7eXhg+fLjw+++/a7xu7969gru7u6Cnp6dxm3v37t2FFi1alFtfRbfdf//990JoaKhgbW0tGBkZCX5+fsKtW7fKvH7ZsmXCK6+8IiiVSqFLly7ChQsXyuzzWbX9+7Z7QRCEvLw8ITg4WLC3txf09fWFpk2bCkuXLhVKSko0+gEQgoKCytRU0XQA/5aZmSmMGTNGqF+/vmBgYCC0atWq3KkBKnvbfaknT54IGzZsEF577TXB3Nxc0NfXF5ycnIQxY8Zo3JJf3m33P//8s9CpUyfByMhIsLe3F6ZPny5ERUUJAITjx48LgiAIf/zxhzB27FihSZMmgqGhoVCvXj2hZ8+ewrFjx8T9VPZnprCwUPj888+FFi1aCEqlUrC0tBQ8PT2FefPmCbm5uS+0LyJtoRAECUYREhEREWkRjiEiIiIi2WMgIiIiItljICIiIiLZYyAiIiIi2WMgIiIiItljINICixcvhkKhwNSpUwE8ndBs8uTJaN68OYyMjNCwYUNMmTJF45lDpSIiIuDh4QFDQ0NYW1sjKCio3PdISUmBmZmZ+MBFIiIi+j+cmLESSkpKkJ6eDjMzsyp/1EF8fDzWrVuHli1borCwEGq1Gr///jtu3bqF+fPno3nz5rh9+zaCg4Nx69Yt8ZENAPDll1/iyy+/xIIFC+Dp6YmHDx8iLS1NfHp2qaKiIgwdOhReXl44d+5cmXYiIqK6SBAE5OXlwd7evsxDmf+N8xBVwp07d+Do6Ch1GURERPQSbt++DQcHh2f24RWiSiidjv/27dtQqVRVtt/AwEBYWlpi0aJF8PPzQ6tWrbB48eJy+27evBnz5s3DH3/8AQDYtWsXAgMDsXLlSixfvhwPHjzAq6++ioULF2r8Rz958iQmT56M06dPY//+/QgNDUVaWlqVHQMREZG2UqvVcHR0rNRjdRiIKqH0azKVSlVlgWjbtm1ISkrC+fPnYWhoCF1dXRgYGJS7/3v37uGLL77Au+++K7ZnZGSgpKQEYWFhWLVqFczNzTFz5kwMHjwYiYmJMDAwwP379xEUFITvvvsODg4OMDIyEo+DiIhILioz3IWBSAK3b9/G+++/j+jo6Gc+nBN4mm79/Pzg7u6OuXPnittLSkpQVFSEVatWoU+fPgCA77//Hra2tjh+/Dh8fHwwfvx4vP322+jWrVt1Hg4REVGtx7vMJBAfH4+srCy0a9cOenp60NPTw8mTJ7Fq1Sro6emhuLgYAJCXl4e+ffvCzMwMu3fvhr6+vrgPOzs7AIC7u7u4rUGDBqhfv774lVhsbCy++OIL8T3GjRuH3Nxc6OnpITw8vAaPmIiISLvxCpEEevXqhaSkJI1tY8aMgaurK2bMmAFdXV2o1Wr4+PhAqVRi3759Za4kdenSBQCQnJwsjhnKzs7GvXv34OTkBACIi4sTwxUA7N27F59//jnOnDmDV155pToPkYiIqFZhIJKAmZkZWrZsqbHNxMQEVlZWaNmyJdRqNfr06YOHDx/iu+++g1qtFm+Vb9CgAXR1ddGsWTMMHDgQ77//Pr7++muoVCqEhobC1dUVPXv2BAC4ublpvMeFCxego6NT5r2JiIjkjoFIC/3666/45ZdfAAAuLi4abampqWjUqBEA4Ntvv0VwcDD8/Pygo6OD7t2748iRIxpfrREREdHzcR6iSlCr1TA3N0dubi7v0CIiIqolXuTvNwdVExERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHscabqGtboo4NSl6Dh5mI/qUsgIiKSHK8QERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsaU0gWrx4MRQKBaZOnSpue/z4MYKCgmBlZQVTU1MMGTIEmZmZGq9LS0uDn58fjI2NYW1tjWnTpuHJkycafU6cOIF27dpBqVTCxcUFERERNXBEREREVFtoRSA6f/48vvrqK3h4eGhsDw4Oxv79+7Fz506cPHkS6enpGDx4sNheXFwMPz8/FBYW4syZM9i8eTMiIiIwe/ZssU9qair8/PzQs2dPJCQkYOrUqQgICEBUVFSNHR8RERFpN8kD0YMHDzBixAh88803sLS0FLfn5uZi48aNWL58OV5//XV4enpi06ZNOHPmDM6ePQsAOHr0KK5evYrvvvsObdq0ga+vLxYsWIA1a9agsLAQALB+/Xo4Oztj2bJlcHNzw6RJk/Dmm28iLCxMkuMlIiIi7SN5IAoKCoKfnx+8vb01tsfHx6OoqEhju6urKxo2bIi4uDgAQFxcHFq1agUbGxuxj4+PD9RqNa5cuSL2+fe+fXx8xH2Up6CgAGq1WmMhIiKiuktPyjfftm0bfv31V5w/f75MW0ZGBgwMDGBhYaGx3cbGBhkZGWKff4ah0vbStmf1UavVePToEYyMjMq896JFizBv3ryXPi4iIiKqXSS7QnT79m28//772Lp1KwwNDaUqo1yhoaHIzc0Vl9u3b0tdEhEREVUjyQJRfHw8srKy0K5dO+jp6UFPTw8nT57EqlWroKenBxsbGxQWFiInJ0fjdZmZmbC1tQUA2NralrnrrHT9eX1UKlW5V4cAQKlUQqVSaSxERERUd0kWiHr16oWkpCQkJCSIS/v27TFixAjx3/r6+oiJiRFfk5ycjLS0NHh5eQEAvLy8kJSUhKysLLFPdHQ0VCoV3N3dxT7/3Edpn9J9kHZZt24dPDw8xCDq5eWFw4cPAwBu3rwJhUJR7rJz504AwP3799G3b1/Y29tDqVTC0dERkyZNKjMOjFMxEBHRP0k2hsjMzAwtW7bU2GZiYgIrKytx+7hx4xASEoJ69epBpVJh8uTJ8PLyQqdOnQAAffr0gbu7O0aOHIklS5YgIyMDM2fORFBQEJRKJQAgMDAQX375JaZPn46xY8ciNjYWO3bswMGDB2v2gKlSHBwcsHjxYjRt2hSCIGDz5s0YOHAgLl68CFdXV9y9e1ej/9dff42lS5fC19cXAKCjo4OBAwfi008/RYMGDZCSkoKgoCBkZ2cjMjISwP9NxRAYGIitW7ciJiYGAQEBsLOzg4+PT40fMxERSU/SQdXPExYWBh0dHQwZMgQFBQXw8fHB2rVrxXZdXV0cOHAAEydOhJeXF0xMTODv74/58+eLfZydnXHw4EEEBwdj5cqVcHBwwIYNG/iHT0v1799fY33hwoVYt24dzp49ixYtWohfhZbavXs3hg4dClNTUwCApaUlJk6cKLY7OTnhvffew9KlS8Vt/5yKAQDc3Nxw+vRphIWF8eeCiEimtCoQnThxQmPd0NAQa9aswZo1ayp8jZOTEw4dOvTM/fbo0QMXL16sihKpBhUXF2Pnzp3Iz88v9yvO+Ph4JCQkPPPnIz09Hbt27UL37t3FbRVNxfDPWdKJiEheJJ+HiOjfkpKSYGpqCqVSicDAQOzevVscE/ZPGzduhJubGzp37lymbfjw4TA2NsYrr7wClUqFDRs2iG3Pm4qBiIjkh4GItE7z5s2RkJCAX375BRMnToS/vz+uXr2q0efRo0eIjIzEuHHjyt1HWFgYfv31V+zduxc3btxASEhITZRORES1lFZ9ZUYEAAYGBnBxcQEAeHp64vz581i5ciW++uorsc8PP/yAhw8fYtSoUeXuw9bWFra2tnB1dUW9evXw2muvYdasWbCzs3upqRiIiKhu4xUi0nolJSUoKCjQ2LZx40YMGDAADRo0qNTrAYj74FQMRET0b7xCRFolNDQUvr6+aNiwIfLy8hAZGYkTJ04gKipK7JOSkoJTp06VO5j+0KFDyMzMRIcOHWBqaoorV65g2rRp6NKlCxo1agSAUzEQEVFZDESkVbKysjBq1CjcvXsX5ubm8PDwQFRUFHr37i32CQ8Ph4ODA/r06VPm9UZGRvjmm28QHByMgoICODo6YvDgwfjoo4/EPpyKgYiI/k0hCIIgdRHaTq1Ww9zcHLm5uf/5MR6NPtKuqxA3F/tJXQIREVG1eJG/3xxDRERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx5mqSWto06SVnLCSiEheeIWIiIiIZI+BiIiIiGSPgYiIiIhkj4GIiIiIZI+BiIiIiGSPgYiIiIhkj4GIiIiIZI+BiIiIiGSPgYiIiIhkj4GIiIiIZI+BiIiIiGSPgYiIiIhkj4GIiIiIZI+BiIiIiGSPgYiIiIhkT9JAtG7dOnh4eEClUkGlUsHLywuHDx8W23v06AGFQqGxBAYGauwjLS0Nfn5+MDY2hrW1NaZNm4YnT55o9Dlx4gTatWsHpVIJFxcXRERE1MThERERUS2hJ+WbOzg4YPHixWjatCkEQcDmzZsxcOBAXLx4ES1atAAAjB8/HvPnzxdfY2xsLP67uLgYfn5+sLW1xZkzZ3D37l2MGjUK+vr6+OyzzwAAqamp8PPzQ2BgILZu3YqYmBgEBATAzs4OPj4+NXvAREREpJUkDUT9+/fXWF+4cCHWrVuHs2fPioHI2NgYtra25b7+6NGjuHr1Ko4dOwYbGxu0adMGCxYswIwZMzB37lwYGBhg/fr1cHZ2xrJlywAAbm5uOH36NMLCwioMRAUFBSgoKBDX1Wp1VRwuERERaSmtGUNUXFyMbdu2IT8/H15eXuL2rVu3on79+mjZsiVCQ0Px8OFDsS0uLg6tWrWCjY2NuM3HxwdqtRpXrlwR+3h7e2u8l4+PD+Li4iqsZdGiRTA3NxcXR0fHqjpMIiIi0kKSXiECgKSkJHh5eeHx48cwNTXF7t274e7uDgB4++234eTkBHt7eyQmJmLGjBlITk7Grl27AAAZGRkaYQiAuJ6RkfHMPmq1Go8ePYKRkVGZmkJDQxESEiKuq9VqhiIiIqI6TPJA1Lx5cyQkJCA3Nxc//PAD/P39cfLkSbi7u2PChAliv1atWsHOzg69evXCjRs30KRJk2qrSalUQqlUVtv+iYiISLtI/pWZgYEBXFxc4OnpiUWLFqF169ZYuXJluX07duwIAEhJSQEA2NraIjMzU6NP6XrpuKOK+qhUqnKvDhEREZH8SB6I/q2kpERjQPM/JSQkAADs7OwAAF5eXkhKSkJWVpbYJzo6GiqVSvzazcvLCzExMRr7iY6O1hinRERERPIm6VdmoaGh8PX1RcOGDZGXl4fIyEicOHECUVFRuHHjBiIjI9GvXz9YWVkhMTERwcHB6NatGzw8PAAAffr0gbu7O0aOHIklS5YgIyMDM2fORFBQkPiVV2BgIL788ktMnz4dY8eORWxsLHbs2IGDBw9KeehERESkRSQNRFlZWRg1ahTu3r0Lc3NzeHh4ICoqCr1798bt27dx7NgxrFixAvn5+XB0dMSQIUMwc+ZM8fW6uro4cOAAJk6cCC8vL5iYmMDf319j3iJnZ2ccPHgQwcHBWLlyJRwcHLBhwwbOQUREREQiSQPRxo0bK2xzdHTEyZMnn7sPJycnHDp06Jl9evTogYsXL75wfURERCQPWjeGiIiIiKimMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkexJGojWrVsHDw8PqFQqqFQqeHl54fDhw2L748ePERQUBCsrK5iammLIkCHIzMzU2EdaWhr8/PxgbGwMa2trTJs2DU+ePNHoc+LECbRr1w5KpRIuLi6IiIioicMjIiKiWkLSQOTg4IDFixcjPj4eFy5cwOuvv46BAwfiypUrAIDg4GDs378fO3fuxMmTJ5Geno7BgweLry8uLoafnx8KCwtx5swZbN68GREREZg9e7bYJzU1FX5+fujZsycSEhIwdepUBAQEICoqqsaPl4iIiLSTQhAEQeoi/qlevXpYunQp3nzzTTRo0ACRkZF48803AQDXrl2Dm5sb4uLi0KlTJxw+fBhvvPEG0tPTYWNjAwBYv349ZsyYgb/++gsGBgaYMWMGDh48iMuXL4vvMWzYMOTk5ODIkSOVqkmtVsPc3By5ublQqVT/6fgafXTwP72+qt1c7Cd1CSJtOjfadF6IiOjlvMjfb60ZQ1RcXIxt27YhPz8fXl5eiI+PR1FREby9vcU+rq6uaNiwIeLi4gAAcXFxaNWqlRiGAMDHxwdqtVq8yhQXF6exj9I+pfsoT0FBAdRqtcZCREREdZfkgSgpKQmmpqZQKpUIDAzE7t274e7ujoyMDBgYGMDCwkKjv42NDTIyMgAAGRkZGmGotL207Vl91Go1Hj16VG5NixYtgrm5ubg4OjpWxaESERGRlpI8EDVv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qVMoKioS+0RHR6N58+awtLSsoaMhIiIibSZpIHrw4AESEhKQkJAA4OlA6oSEBKSlpUGhUGDq1Kn49NNPsW/fPiQlJWHUqFGwt7fHoEGDAABubm7o27cvxo8fj3PnzuHnn3/GpEmTMGzYMNjb2wMA3n77bRgYGGDcuHG4cuUKtm/fjpUrVyIkJESioyYiIiJtI+lt9xcuXEDPnj3F9dKQ4u/vj4iICEyfPh35+fmYMGECcnJy0LVrVxw5cgSGhobia7Zu3YpJkyahV69e0NHRwZAhQ7Bq1Sqx3dzcHEePHkVQUBA8PT1Rv359zJ49m7fcExERkUjSQNSjRw8IglBhu0KhwPz58zF//vwK+9SrVw+RkZHPfB8PDw/89NNPL10nERER1W1aO4aIiIiIqKYwEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7Gl1IJo7dy4UCoXG4urqKrY/fvwYQUFBsLKygqmpKYYMGYLMzEyNfaSlpcHPzw/GxsawtrbGtGnT8OTJk5o+FCIiolpr3bp18PDwgEqlgkqlgpeXFw4fPiy2V+bvcUxMDDp37gwzMzPY2tpixowZWvX3WKsDEQC0aNECd+/eFZfTp0+LbcHBwdi/fz927tyJkydPIj09HYMHDxbbi4uL4efnh8LCQpw5cwabN29GREQEZs+eLcWhEBER1UoODg5YvHgx4uPjceHCBbz++usYOHAgrly5AuD5f48vXbqEfv36oW/fvrh48SK2b9+Offv24aOPPpLqkMrQk7qA59HT04OtrW2Z7bm5udi4cSMiIyPx+uuvAwA2bdoENzc3nD17Fp06dcLRo0dx9epVHDt2DDY2NmjTpg0WLFiAGTNmYO7cuTAwMKjpwyEiIqp1+vfvr7G+cOFCrFu3DmfPnoWDg8Nz/x5v374dHh4e4gUJFxcXLFmyBEOHDsWcOXNgZmZW48f0b1p/hej69euw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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 计算不同类别的分布情况\n",
    "class_counts = df_labels['class'].value_counts()\n",
    "\n",
    "# 绘制条形图\n",
    "ax = class_counts.plot(kind='bar')\n",
    "plt.xlabel('Class')  # 设置x轴标签\n",
    "plt.ylabel('Count')  # 设置y轴标签\n",
    "plt.title('Distribution of Classes')  # 设置图表标题\n",
    "\n",
    "# 在每个条形的顶部显示数值\n",
    "for p in ax.patches:\n",
    "    ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()),\n",
    "                ha='center', va='bottom',\n",
    "                xytext=(0, 5),  # 5 points vertical offset\n",
    "                textcoords='offset points')\n",
    "\n",
    "# 显示图表\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2fe01ca3-9e12-46db-a795-b8beb8c3eed4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            box_width  box_height\n",
      "class                            \n",
      "A220        82.050670   72.978016\n",
      "A320/321    95.790514   88.012987\n",
      "A330       104.213592   96.064725\n",
      "ARJ21       70.093513   61.375737\n",
      "Boeing737   86.829097   81.045757\n",
      "Boeing787   90.573913   88.758790\n",
      "other       86.286116   81.966932\n"
     ]
    }
   ],
   "source": [
    "# 每个类别对象的平均宽度和高度\n",
    "avg_dimensions = df_labels.groupby('class')[['box_width', 'box_height']].mean()\n",
    "print(avg_dimensions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "2a1f0c16-d9d7-4213-81a6-a6752a72bb7f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>filename</th>\n",
       "      <th>image_relative_path</th>\n",
       "      <th>image_width</th>\n",
       "      <th>image_height</th>\n",
       "      <th>class</th>\n",
       "      <th>cls_id</th>\n",
       "      <th>xmin</th>\n",
       "      <th>ymin</th>\n",
       "      <th>xmax</th>\n",
       "      <th>ymax</th>\n",
       "      <th>box_width</th>\n",
       "      <th>box_height</th>\n",
       "      <th>center_x</th>\n",
       "      <th>center_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>459</td>\n",
       "      <td>1433</td>\n",
       "      <td>536</td>\n",
       "      <td>1499</td>\n",
       "      <td>77</td>\n",
       "      <td>66</td>\n",
       "      <td>497.5</td>\n",
       "      <td>1466.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>988</td>\n",
       "      <td>1426</td>\n",
       "      <td>1064</td>\n",
       "      <td>1499</td>\n",
       "      <td>76</td>\n",
       "      <td>73</td>\n",
       "      <td>1026.0</td>\n",
       "      <td>1462.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>713</td>\n",
       "      <td>777</td>\n",
       "      <td>772</td>\n",
       "      <td>829</td>\n",
       "      <td>59</td>\n",
       "      <td>52</td>\n",
       "      <td>742.5</td>\n",
       "      <td>803.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>1072</td>\n",
       "      <td>461</td>\n",
       "      <td>1153</td>\n",
       "      <td>545</td>\n",
       "      <td>81</td>\n",
       "      <td>84</td>\n",
       "      <td>1112.5</td>\n",
       "      <td>503.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>956</td>\n",
       "      <td>464</td>\n",
       "      <td>1038</td>\n",
       "      <td>555</td>\n",
       "      <td>82</td>\n",
       "      <td>91</td>\n",
       "      <td>997.0</td>\n",
       "      <td>509.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16458</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>123</td>\n",
       "      <td>354</td>\n",
       "      <td>189</td>\n",
       "      <td>408</td>\n",
       "      <td>66</td>\n",
       "      <td>54</td>\n",
       "      <td>156.0</td>\n",
       "      <td>381.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16459</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>242</td>\n",
       "      <td>334</td>\n",
       "      <td>313</td>\n",
       "      <td>408</td>\n",
       "      <td>71</td>\n",
       "      <td>74</td>\n",
       "      <td>277.5</td>\n",
       "      <td>371.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16460</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>344</td>\n",
       "      <td>342</td>\n",
       "      <td>425</td>\n",
       "      <td>416</td>\n",
       "      <td>81</td>\n",
       "      <td>74</td>\n",
       "      <td>384.5</td>\n",
       "      <td>379.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16461</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>565</td>\n",
       "      <td>301</td>\n",
       "      <td>645</td>\n",
       "      <td>364</td>\n",
       "      <td>80</td>\n",
       "      <td>63</td>\n",
       "      <td>605.0</td>\n",
       "      <td>332.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16462</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>683</td>\n",
       "      <td>263</td>\n",
       "      <td>750</td>\n",
       "      <td>315</td>\n",
       "      <td>67</td>\n",
       "      <td>52</td>\n",
       "      <td>716.5</td>\n",
       "      <td>289.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>16463 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          filename                           image_relative_path  image_width  \\\n",
       "0      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "1      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "2      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "3      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "4      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "...            ...                                           ...          ...   \n",
       "16458  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16459  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16460  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16461  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16462  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "\n",
       "       image_height      class  cls_id  xmin  ymin  xmax  ymax  box_width  \\\n",
       "0              1500  Boeing787       5   459  1433   536  1499         77   \n",
       "1              1500  Boeing737       4   988  1426  1064  1499         76   \n",
       "2              1200  Boeing787       5   713   777   772   829         59   \n",
       "3              1200       A220       2  1072   461  1153   545         81   \n",
       "4              1200       A220       2   956   464  1038   555         82   \n",
       "...             ...        ...     ...   ...   ...   ...   ...        ...   \n",
       "16458          1200  Boeing737       4   123   354   189   408         66   \n",
       "16459          1200       A220       2   242   334   313   408         71   \n",
       "16460          1200       A220       2   344   342   425   416         81   \n",
       "16461          1200       A220       2   565   301   645   364         80   \n",
       "16462          1200       A220       2   683   263   750   315         67   \n",
       "\n",
       "       box_height  center_x  center_y  \n",
       "0              66     497.5    1466.0  \n",
       "1              73    1026.0    1462.5  \n",
       "2              52     742.5     803.0  \n",
       "3              84    1112.5     503.0  \n",
       "4              91     997.0     509.5  \n",
       "...           ...       ...       ...  \n",
       "16458          54     156.0     381.0  \n",
       "16459          74     277.5     371.0  \n",
       "16460          74     384.5     379.0  \n",
       "16461          63     605.0     332.5  \n",
       "16462          52     716.5     289.0  \n",
       "\n",
       "[16463 rows x 14 columns]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "94b6d28e-cd87-4bbb-9c35-f80dcc8a65ed",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0000008.jpg' '0000011.jpg' '0000013.jpg' '0000017.jpg' '0000023.jpg'\n",
      " '0000026.jpg' '0000051.jpg' '0000062.jpg' '0000069.jpg' '0000074.jpg'\n",
      " '0000088.jpg' '0000092.jpg' '0000095.jpg' '0000101.jpg' '0000106.jpg'\n",
      " '0000112.jpg' '0000134.jpg' '0000136.jpg' '0000137.jpg' '0000138.jpg'\n",
      " '0000140.jpg' '0000146.jpg' '0000152.jpg' '0000157.jpg' '0000170.jpg'\n",
      " '0000175.jpg' '0000184.jpg' '0000187.jpg' '0000192.jpg' '0000196.jpg'\n",
      " '0000200.jpg' '0000211.jpg' '0000228.jpg' '0000235.jpg' '0000243.jpg'\n",
      " '0000257.jpg' '0000258.jpg' '0000261.jpg' '0000268.jpg' '0000275.jpg'\n",
      " '0000288.jpg' '0000289.jpg' '0000291.jpg' '0000292.jpg' '0000297.jpg'\n",
      " '0000304.jpg' '0000318.jpg' '0000321.jpg' '0000324.jpg' '0000328.jpg'\n",
      " '0000330.jpg' '0000331.jpg' '0000332.jpg' '0000334.jpg' '0000338.jpg'\n",
      " '0000341.jpg' '0000355.jpg' '0000356.jpg' '0000361.jpg' '0000367.jpg'\n",
      " '0000369.jpg' '0000380.jpg' '0000390.jpg' '0000394.jpg' '0000406.jpg'\n",
      " '0000410.jpg' '0000413.jpg' '0000419.jpg' '0000420.jpg' '0000421.jpg'\n",
      " '0000423.jpg' '0000427.jpg' '0000428.jpg' '0000431.jpg' '0000436.jpg'\n",
      " '0000439.jpg' '0000446.jpg' '0000449.jpg' '0000451.jpg' '0000457.jpg'\n",
      " '0000460.jpg' '0000463.jpg' '0000466.jpg' '0000467.jpg' '0000471.jpg'\n",
      " '0000472.jpg' '0000475.jpg' '0000480.jpg' '0000501.jpg' '0000505.jpg'\n",
      " '0000519.jpg' '0000521.jpg' '0000522.jpg' '0000527.jpg' '0000530.jpg'\n",
      " '0000532.jpg' '0000536.jpg' '0000537.jpg' '0000539.jpg' '0000550.jpg'\n",
      " '0000562.jpg' '0000576.jpg' '0000587.jpg' '0000612.jpg' '0000613.jpg'\n",
      " '0000614.jpg' '0000619.jpg' '0000622.jpg' '0000623.jpg' '0000626.jpg'\n",
      " '0000630.jpg' '0000638.jpg' '0000645.jpg' '0000656.jpg' '0000663.jpg'\n",
      " '0000664.jpg' '0000667.jpg' '0000669.jpg' '0000679.jpg' '0000683.jpg'\n",
      " '0000685.jpg' '0000686.jpg' '0000687.jpg' '0000706.jpg' '0000711.jpg'\n",
      " '0000718.jpg' '0000726.jpg' '0000731.jpg' '0000738.jpg' '0000739.jpg'\n",
      " '0000742.jpg' '0000743.jpg' '0000744.jpg' '0000749.jpg' '0000753.jpg'\n",
      " '0000756.jpg' '0000763.jpg' '0000770.jpg' '0000775.jpg' '0000779.jpg'\n",
      " '0000797.jpg' '0000798.jpg' '0000799.jpg' '0000805.jpg' '0000810.jpg'\n",
      " '0000813.jpg' '0000819.jpg' '0000828.jpg' '0000841.jpg' '0000850.jpg'\n",
      " '0000852.jpg' '0000855.jpg' '0000856.jpg' '0000870.jpg' '0000873.jpg'\n",
      " '0000874.jpg' '0000878.jpg' '0000879.jpg' '0000881.jpg' '0000882.jpg'\n",
      " '0000886.jpg' '0000896.jpg' '0000906.jpg' '0000915.jpg' '0000923.jpg'\n",
      " '0000938.jpg' '0000955.jpg' '0000958.jpg' '0000959.jpg' '0000961.jpg'\n",
      " '0000972.jpg' '0000973.jpg' '0000990.jpg' '0000991.jpg' '0000992.jpg'\n",
      " '0000997.jpg' '0001001.jpg' '0001002.jpg' '0001008.jpg' '0001009.jpg'\n",
      " '0001017.jpg' '0001025.jpg' '0001029.jpg' '0001030.jpg' '0001047.jpg'\n",
      " '0001048.jpg' '0001050.jpg' '0001051.jpg' '0001065.jpg' '0001068.jpg'\n",
      " '0001077.jpg' '0001086.jpg' '0001097.jpg' '0001099.jpg' '0001113.jpg'\n",
      " '0001119.jpg' '0001131.jpg' '0001134.jpg' '0001145.jpg' '0001146.jpg'\n",
      " '0001151.jpg' '0001166.jpg' '0001169.jpg' '0001171.jpg' '0001176.jpg'\n",
      " '0001177.jpg' '0001179.jpg' '0001181.jpg' '0001182.jpg' '0001185.jpg'\n",
      " '0001187.jpg' '0001202.jpg' '0001227.jpg' '0001230.jpg' '0001236.jpg'\n",
      " '0001239.jpg' '0001240.jpg' '0001250.jpg' '0001253.jpg' '0001270.jpg'\n",
      " '0001276.jpg' '0001314.jpg' '0001320.jpg' '0001342.jpg' '0001346.jpg'\n",
      " '0001357.jpg' '0001366.jpg' '0001372.jpg' '0001373.jpg' '0001389.jpg'\n",
      " '0001392.jpg' '0001393.jpg' '0001396.jpg' '0001400.jpg' '0001403.jpg'\n",
      " '0001410.jpg' '0001417.jpg' '0001423.jpg' '0001429.jpg' '0001431.jpg'\n",
      " '0001436.jpg' '0001441.jpg' '0001443.jpg' '0001444.jpg' '0001452.jpg'\n",
      " '0001453.jpg' '0001463.jpg' '0001464.jpg' '0001473.jpg' '0001481.jpg'\n",
      " '0001488.jpg' '0001499.jpg' '0001504.jpg' '0001505.jpg' '0001507.jpg'\n",
      " '0001508.jpg' '0001512.jpg' '0001516.jpg' '0001520.jpg' '0001522.jpg'\n",
      " '0001535.jpg' '0001540.jpg' '0001547.jpg' '0001548.jpg' '0001550.jpg'\n",
      " '0001555.jpg' '0001561.jpg' '0001563.jpg' '0001568.jpg' '0001569.jpg'\n",
      " '0001574.jpg' '0001595.jpg' '0001598.jpg' '0001601.jpg' '0001602.jpg'\n",
      " '0001604.jpg' '0001605.jpg' '0001617.jpg' '0001621.jpg' '0001622.jpg'\n",
      " '0001623.jpg' '0001624.jpg' '0001627.jpg' '0001631.jpg' '0001637.jpg'\n",
      " '0001651.jpg' '0001657.jpg' '0001659.jpg' '0001662.jpg' '0001663.jpg'\n",
      " '0001665.jpg' '0001669.jpg' '0001674.jpg' '0001676.jpg' '0001678.jpg'\n",
      " '0001680.jpg' '0001692.jpg' '0001699.jpg' '0001706.jpg' '0001710.jpg'\n",
      " '0001711.jpg' '0001714.jpg' '0001721.jpg' '0001731.jpg' '0001742.jpg'\n",
      " '0001746.jpg' '0001750.jpg' '0001752.jpg' '0001759.jpg' '0001764.jpg'\n",
      " '0001770.jpg' '0001774.jpg' '0001784.jpg' '0001791.jpg' '0001794.jpg'\n",
      " '0001802.jpg' '0001811.jpg' '0001816.jpg' '0001818.jpg' '0001825.jpg'\n",
      " '0001829.jpg' '0001830.jpg' '0001838.jpg' '0001839.jpg' '0001845.jpg'\n",
      " '0001848.jpg' '0001858.jpg' '0001865.jpg' '0001870.jpg' '0001872.jpg'\n",
      " '0001889.jpg' '0001898.jpg' '0001911.jpg' '0001913.jpg' '0001917.jpg'\n",
      " '0001923.jpg' '0001933.jpg' '0001943.jpg' '0001949.jpg' '0001951.jpg'\n",
      " '0001958.jpg' '0001982.jpg' '0001988.jpg' '0001992.jpg' '0001994.jpg'\n",
      " '0001995.jpg' '0002000.jpg' '0002001.jpg' '0002005.jpg' '0002016.jpg'\n",
      " '0002024.jpg' '0002038.jpg' '0002047.jpg' '0002049.jpg' '0002050.jpg'\n",
      " '0002051.jpg' '0002057.jpg' '0002063.jpg' '0002067.jpg' '0002073.jpg'\n",
      " '0002076.jpg' '0002081.jpg' '0002096.jpg' '0002100.jpg' '0002131.jpg'\n",
      " '0002138.jpg' '0002143.jpg' '0002146.jpg' '0002147.jpg' '0002150.jpg'\n",
      " '0002153.jpg' '0002154.jpg' '0002162.jpg' '0002167.jpg' '0002174.jpg'\n",
      " '0002175.jpg' '0002179.jpg' '0002180.jpg' '0002182.jpg' '0002183.jpg'\n",
      " '0002191.jpg' '0002196.jpg' '0002209.jpg' '0002214.jpg' '0002221.jpg'\n",
      " '0002225.jpg' '0002229.jpg' '0002236.jpg' '0002243.jpg' '0002247.jpg'\n",
      " '0002258.jpg' '0002266.jpg' '0002270.jpg' '0002272.jpg' '0002278.jpg'\n",
      " '0002279.jpg' '0002288.jpg' '0002300.jpg' '0002310.jpg' '0002315.jpg'\n",
      " '0002323.jpg' '0002330.jpg' '0002339.jpg' '0002345.jpg' '0002352.jpg'\n",
      " '0002355.jpg' '0002357.jpg' '0002358.jpg' '0002370.jpg' '0002372.jpg'\n",
      " '0002384.jpg' '0002387.jpg' '0002392.jpg' '0002395.jpg' '0002397.jpg'\n",
      " '0002399.jpg' '0002400.jpg' '0002408.jpg' '0002417.jpg' '0002418.jpg'\n",
      " '0002426.jpg' '0002429.jpg' '0002430.jpg' '0002431.jpg' '0002432.jpg'\n",
      " '0002435.jpg' '0002444.jpg' '0002448.jpg' '0002456.jpg' '0002460.jpg'\n",
      " '0002462.jpg' '0002484.jpg' '0002501.jpg' '0002503.jpg' '0002505.jpg'\n",
      " '0002506.jpg' '0002511.jpg' '0002512.jpg' '0002519.jpg' '0002528.jpg'\n",
      " '0002537.jpg' '0002544.jpg' '0002547.jpg' '0002553.jpg' '0002559.jpg'\n",
      " '0002567.jpg' '0002568.jpg' '0002574.jpg' '0002577.jpg' '0002581.jpg'\n",
      " '0002598.jpg' '0002608.jpg' '0002616.jpg' '0002617.jpg' '0002621.jpg'\n",
      " '0002623.jpg' '0002628.jpg' '0002631.jpg' '0002639.jpg' '0002641.jpg'\n",
      " '0002643.jpg' '0002645.jpg' '0002652.jpg' '0002657.jpg' '0002662.jpg'\n",
      " '0002666.jpg' '0002669.jpg' '0002671.jpg' '0002676.jpg' '0002680.jpg'\n",
      " '0002681.jpg' '0002701.jpg' '0002707.jpg' '0002722.jpg' '0002727.jpg'\n",
      " '0002736.jpg' '0002737.jpg' '0002739.jpg' '0002740.jpg' '0002744.jpg'\n",
      " '0002749.jpg' '0002751.jpg' '0002754.jpg' '0002762.jpg' '0002764.jpg'\n",
      " '0002765.jpg' '0002767.jpg' '0002768.jpg' '0002774.jpg' '0002775.jpg'\n",
      " '0002784.jpg' '0002787.jpg' '0002788.jpg' '0002792.jpg' '0002793.jpg'\n",
      " '0002798.jpg' '0002799.jpg' '0002806.jpg' '0002807.jpg' '0002808.jpg'\n",
      " '0002812.jpg' '0002816.jpg' '0002824.jpg' '0002825.jpg' '0002828.jpg'\n",
      " '0002834.jpg' '0002837.jpg' '0002839.jpg' '0002852.jpg' '0002853.jpg'\n",
      " '0002854.jpg' '0002856.jpg' '0002857.jpg' '0002861.jpg' '0002862.jpg'\n",
      " '0002870.jpg' '0002872.jpg' '0002873.jpg' '0002877.jpg' '0002879.jpg'\n",
      " '0002883.jpg' '0002888.jpg' '0002890.jpg' '0002892.jpg' '0002902.jpg'\n",
      " '0002904.jpg' '0002909.jpg' '0002920.jpg' '0002921.jpg' '0002931.jpg'\n",
      " '0002938.jpg' '0002973.jpg' '0002976.jpg' '0002980.jpg' '0002991.jpg'\n",
      " '0002993.jpg' '0002997.jpg' '0003004.jpg' '0003012.jpg' '0003016.jpg'\n",
      " '0003031.jpg' '0003050.jpg' '0003054.jpg' '0003060.jpg' '0003066.jpg'\n",
      " '0003068.jpg' '0003079.jpg' '0003081.jpg' '0003084.jpg' '0003088.jpg'\n",
      " '0003089.jpg' '0003098.jpg' '0003102.jpg' '0003107.jpg' '0003115.jpg'\n",
      " '0003125.jpg' '0003132.jpg' '0003138.jpg' '0003147.jpg' '0003149.jpg'\n",
      " '0003151.jpg' '0003154.jpg' '0003160.jpg' '0003162.jpg' '0003166.jpg'\n",
      " '0003182.jpg' '0003184.jpg' '0003186.jpg' '0003191.jpg' '0003193.jpg'\n",
      " '0003198.jpg' '0003199.jpg' '0003207.jpg' '0003216.jpg' '0003218.jpg'\n",
      " '0003220.jpg' '0003222.jpg' '0003227.jpg' '0003236.jpg' '0003238.jpg'\n",
      " '0003240.jpg' '0003243.jpg' '0003252.jpg' '0003253.jpg' '0003260.jpg'\n",
      " '0003262.jpg' '0003268.jpg' '0003273.jpg' '0003274.jpg' '0003279.jpg'\n",
      " '0003284.jpg' '0003288.jpg' '0003289.jpg' '0003291.jpg' '0003294.jpg'\n",
      " '0003302.jpg' '0003306.jpg' '0003307.jpg' '0003315.jpg' '0003323.jpg'\n",
      " '0003325.jpg' '0003332.jpg' '0003348.jpg' '0003350.jpg' '0003362.jpg'\n",
      " '0003375.jpg' '0003378.jpg' '0003396.jpg' '0003403.jpg' '0003405.jpg'\n",
      " '0003427.jpg' '0003433.jpg' '0003441.jpg' '0003444.jpg' '0003446.jpg'\n",
      " '0003455.jpg' '0003461.jpg' '0003465.jpg' '0003467.jpg' '0003468.jpg'\n",
      " '0003475.jpg' '0003476.jpg' '0003479.jpg' '0003481.jpg' '0003486.jpg'\n",
      " '0003490.jpg' '0003493.jpg' '0003494.jpg' '0003497.jpg' '0003502.jpg'\n",
      " '0003504.jpg' '0003509.jpg' '0003518.jpg' '0003523.jpg' '0003532.jpg'\n",
      " '0003546.jpg' '0003554.jpg' '0003560.jpg' '0003561.jpg' '0003581.jpg'\n",
      " '0003587.jpg' '0003589.jpg' '0003590.jpg' '0003611.jpg' '0003612.jpg'\n",
      " '0003613.jpg' '0003619.jpg' '0003627.jpg' '0003634.jpg' '0003639.jpg'\n",
      " '0003650.jpg' '0003657.jpg' '0003676.jpg' '0003678.jpg' '0003681.jpg'\n",
      " '0003687.jpg' '0003689.jpg' '0003698.jpg' '0003708.jpg' '0003710.jpg'\n",
      " '0003717.jpg' '0003726.jpg' '0003750.jpg' '0003768.jpg' '0003770.jpg'\n",
      " '0003774.jpg' '0003775.jpg' '0003777.jpg' '0003784.jpg' '0003789.jpg'\n",
      " '0003806.jpg' '0003809.jpg' '0003816.jpg' '0003821.jpg' '0003826.jpg'\n",
      " '0003831.jpg' '0003835.jpg' '0003838.jpg' '0003839.jpg' '0003845.jpg'\n",
      " '0003850.jpg' '0003861.jpg' '0003876.jpg' '0003879.jpg' '0003882.jpg'\n",
      " '0003903.jpg' '0003907.jpg' '0003909.jpg' '0003915.jpg' '0003916.jpg'\n",
      " '0003917.jpg' '0003929.jpg' '0003930.jpg' '0003944.jpg' '0003945.jpg'\n",
      " '0003956.jpg' '0003958.jpg' '0003980.jpg' '0003981.jpg' '0003986.jpg'\n",
      " '0003995.jpg' '0003997.jpg' '0003998.jpg' '0004000.jpg' '0004004.jpg'\n",
      " '0004007.jpg' '0004011.jpg' '0004017.jpg' '0004022.jpg' '0004025.jpg'\n",
      " '0004031.jpg' '0004041.jpg' '0004046.jpg' '0004059.jpg' '0004066.jpg'\n",
      " '0004068.jpg' '0004071.jpg' '0004083.jpg' '0004090.jpg' '0004091.jpg'\n",
      " '0004094.jpg' '0004096.jpg' '0004098.jpg' '0004114.jpg' '0004122.jpg'\n",
      " '0004125.jpg' '0004132.jpg' '0004138.jpg' '0004140.jpg' '0004144.jpg'\n",
      " '0004150.jpg' '0004155.jpg' '0004163.jpg' '0004177.jpg' '0004180.jpg'\n",
      " '0004181.jpg' '0004187.jpg' '0004195.jpg' '0004204.jpg' '0004216.jpg'\n",
      " '0004221.jpg' '0004225.jpg' '0004226.jpg' '0004231.jpg' '0004236.jpg'\n",
      " '0004237.jpg' '0004247.jpg' '0004250.jpg' '0004268.jpg' '0004276.jpg'\n",
      " '0004278.jpg' '0004280.jpg' '0004283.jpg' '0004284.jpg' '0004286.jpg'\n",
      " '0004300.jpg' '0004311.jpg' '0004316.jpg' '0004323.jpg' '0004328.jpg'\n",
      " '0004330.jpg' '0004334.jpg' '0004340.jpg' '0004342.jpg' '0004343.jpg'\n",
      " '0004352.jpg' '0004356.jpg' '0004357.jpg' '0004358.jpg' '0004361.jpg']\n"
     ]
    }
   ],
   "source": [
    "# 定义筛选条件\n",
    "def only_other_or_A220(group):\n",
    "    return set(group['class']).issubset({'other', 'A220'})\n",
    "\n",
    "# 应用筛选条件并获取符合条件的文件名\n",
    "filtered_filenames = df_labels.groupby('filename').filter(only_other_or_A220)['filename'].unique()\n",
    "\n",
    "# 打印结果\n",
    "print(filtered_filenames)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "61b00778-20e2-4f5a-8cab-dea449e32536",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(770,)"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 只包含other和 A220的数据是 770个\n",
    "filtered_filenames.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "120b982b-3953-4e5b-9ec3-e19d3ff50c5a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected filename: 0003198.jpg\n",
      "Classes in this file:\n",
      "['A220']\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "# 从 filtered_filenames 中随机选择一个 filename\n",
    "random_filename = random.choice(filtered_filenames)\n",
    "\n",
    "# 从 DataFrame 中筛选出属于该 filename 的行，并获取所有的 class\n",
    "classes_in_random_filename = df_labels[df_labels['filename'] == random_filename]['class']\n",
    "\n",
    "# 打印结果\n",
    "print(f\"Selected filename: {random_filename}\")\n",
    "print(\"Classes in this file:\")\n",
    "print(classes_in_random_filename.unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "e566b95e-9a84-4241-9442-bceb33be088f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Remaining number of unique filenames: 3598\n"
     ]
    }
   ],
   "source": [
    "# 从 df_labels 中移除 filtered_filenames 对应的记录\n",
    "remaining_df = df_labels[~df_labels['filename'].isin(filtered_filenames)]\n",
    "\n",
    "# 获取剩余的不同 filename 的数量\n",
    "remaining_filenames_count = remaining_df['filename'].nunique()\n",
    "\n",
    "# 打印结果\n",
    "print(f\"Remaining number of unique filenames: {remaining_filenames_count}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "34227d44-97d8-4df0-8fb2-605e4f7cf590",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>filename</th>\n",
       "      <th>image_relative_path</th>\n",
       "      <th>image_width</th>\n",
       "      <th>image_height</th>\n",
       "      <th>class</th>\n",
       "      <th>cls_id</th>\n",
       "      <th>xmin</th>\n",
       "      <th>ymin</th>\n",
       "      <th>xmax</th>\n",
       "      <th>ymax</th>\n",
       "      <th>box_width</th>\n",
       "      <th>box_height</th>\n",
       "      <th>center_x</th>\n",
       "      <th>center_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>459</td>\n",
       "      <td>1433</td>\n",
       "      <td>536</td>\n",
       "      <td>1499</td>\n",
       "      <td>77</td>\n",
       "      <td>66</td>\n",
       "      <td>497.5</td>\n",
       "      <td>1466.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>988</td>\n",
       "      <td>1426</td>\n",
       "      <td>1064</td>\n",
       "      <td>1499</td>\n",
       "      <td>76</td>\n",
       "      <td>73</td>\n",
       "      <td>1026.0</td>\n",
       "      <td>1462.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>713</td>\n",
       "      <td>777</td>\n",
       "      <td>772</td>\n",
       "      <td>829</td>\n",
       "      <td>59</td>\n",
       "      <td>52</td>\n",
       "      <td>742.5</td>\n",
       "      <td>803.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>1072</td>\n",
       "      <td>461</td>\n",
       "      <td>1153</td>\n",
       "      <td>545</td>\n",
       "      <td>81</td>\n",
       "      <td>84</td>\n",
       "      <td>1112.5</td>\n",
       "      <td>503.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>956</td>\n",
       "      <td>464</td>\n",
       "      <td>1038</td>\n",
       "      <td>555</td>\n",
       "      <td>82</td>\n",
       "      <td>91</td>\n",
       "      <td>997.0</td>\n",
       "      <td>509.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16458</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>123</td>\n",
       "      <td>354</td>\n",
       "      <td>189</td>\n",
       "      <td>408</td>\n",
       "      <td>66</td>\n",
       "      <td>54</td>\n",
       "      <td>156.0</td>\n",
       "      <td>381.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16459</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>242</td>\n",
       "      <td>334</td>\n",
       "      <td>313</td>\n",
       "      <td>408</td>\n",
       "      <td>71</td>\n",
       "      <td>74</td>\n",
       "      <td>277.5</td>\n",
       "      <td>371.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16460</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>344</td>\n",
       "      <td>342</td>\n",
       "      <td>425</td>\n",
       "      <td>416</td>\n",
       "      <td>81</td>\n",
       "      <td>74</td>\n",
       "      <td>384.5</td>\n",
       "      <td>379.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16461</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>565</td>\n",
       "      <td>301</td>\n",
       "      <td>645</td>\n",
       "      <td>364</td>\n",
       "      <td>80</td>\n",
       "      <td>63</td>\n",
       "      <td>605.0</td>\n",
       "      <td>332.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16462</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>683</td>\n",
       "      <td>263</td>\n",
       "      <td>750</td>\n",
       "      <td>315</td>\n",
       "      <td>67</td>\n",
       "      <td>52</td>\n",
       "      <td>716.5</td>\n",
       "      <td>289.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14713 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          filename                           image_relative_path  image_width  \\\n",
       "0      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "1      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "2      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "3      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "4      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "...            ...                                           ...          ...   \n",
       "16458  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16459  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16460  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16461  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16462  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "\n",
       "       image_height      class  cls_id  xmin  ymin  xmax  ymax  box_width  \\\n",
       "0              1500  Boeing787       5   459  1433   536  1499         77   \n",
       "1              1500  Boeing737       4   988  1426  1064  1499         76   \n",
       "2              1200  Boeing787       5   713   777   772   829         59   \n",
       "3              1200       A220       2  1072   461  1153   545         81   \n",
       "4              1200       A220       2   956   464  1038   555         82   \n",
       "...             ...        ...     ...   ...   ...   ...   ...        ...   \n",
       "16458          1200  Boeing737       4   123   354   189   408         66   \n",
       "16459          1200       A220       2   242   334   313   408         71   \n",
       "16460          1200       A220       2   344   342   425   416         81   \n",
       "16461          1200       A220       2   565   301   645   364         80   \n",
       "16462          1200       A220       2   683   263   750   315         67   \n",
       "\n",
       "       box_height  center_x  center_y  \n",
       "0              66     497.5    1466.0  \n",
       "1              73    1026.0    1462.5  \n",
       "2              52     742.5     803.0  \n",
       "3              84    1112.5     503.0  \n",
       "4              91     997.0     509.5  \n",
       "...           ...       ...       ...  \n",
       "16458          54     156.0     381.0  \n",
       "16459          74     277.5     371.0  \n",
       "16460          74     384.5     379.0  \n",
       "16461          63     605.0     332.5  \n",
       "16462          52     716.5     289.0  \n",
       "\n",
       "[14713 rows x 14 columns]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "remaining_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "c2ce8a64-dcd3-446d-908f-28a743fc744d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "other        4264\n",
       "A220         3730\n",
       "Boeing787    2645\n",
       "Boeing737    2557\n",
       "A320/321     1771\n",
       "ARJ21        1187\n",
       "A330          309\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别ID的数量\n",
    "df_labels['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "ab160fb6-ecf1-43b6-8c0e-ee9305f2816f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "other        3830\n",
       "Boeing787    2645\n",
       "Boeing737    2557\n",
       "A220         2414\n",
       "A320/321     1771\n",
       "ARJ21        1187\n",
       "A330          309\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别ID的数量\n",
    "remaining_df['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "5c954288-fbaf-4a87-87ea-70f3e549a9a0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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fd+QIUNUUFCgdevWnXddHo9HoaGhKiwslNPp/DW7qEseTP9V77+Yvp2VZHUJAABUmfP9+33B18CUlZVp9erVKi4ulsvl8q5fuXKlmjVrpo4dO2rKlCk6duyYty0rK0udOnXyhhdJSkxMlMfj0e7du719EhISfD4rMTFRWVlZ56ynpKREHo/HZwEAALVTpU4hSdKuXbvkcrl04sQJNWzYUK+99ppiY2MlSXfeeadatWql6Oho7dy5U5MnT9bevXv16quvSpLcbrdPeJHkfe12u8/Zx+Px6Pjx4woODq6wrpkzZ2r69OmV3R0AAGBDlQ4w7dq1U05OjgoLC/XPf/5TycnJ2rRpk2JjYzV69Ghvv06dOikqKkp9+vTRvn37dNlll13Uwn9uypQpSktL8772eDyKiYmp0s8EAADWqPQppKCgILVp00bx8fGaOXOmOnfurPnz51fYt3v37pKkr7/+WpIUGRmpvLw8nz6nX0dGRp6zj9PpPOvRF0lyOBzeu6NOLwAAoHb61fPAlJeXq6SkpMK2nJwcSVJUVJQkyeVyadeuXcrPz/f2ycjIkNPp9J6GcrlcyszM9NlORkaGz3U2AACgbqvUKaQpU6aof//+atmypYqKirRq1Spt3LhR69ev1759+7Rq1SrddNNNatq0qXbu3KkJEyaoZ8+eiouLkyT17dtXsbGxGj58uGbPni23262pU6cqNTVVDodDkjRmzBg999xzmjRpkkaOHKkNGzbo5ZdfVnp6zbkTCAAAWKtSASY/P18jRozQoUOHFBoaqri4OK1fv1433nijDhw4oPfee0/z5s1TcXGxYmJiNHjwYE2dOtX7/oCAAK1du1Zjx46Vy+VSgwYNlJyc7DNvTOvWrZWenq4JEyZo/vz5atGihZYsWcIcMAAAwOtXzwNTUzEPDAAA9lPl88AAAABYhQADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABshwADAABsp1IB5vnnn1dcXJycTqecTqdcLpfeeecdb/uJEyeUmpqqpk2bqmHDhho8eLDy8vJ8tpGbm6ukpCSFhIQoPDxcEydO1KlTp3z6bNy4Ud26dZPD4VCbNm20fPnyC99DAABQ61QqwLRo0UKzZs1Sdna2Pv30U91www0aOHCgdu/eLUmaMGGC3nrrLb3yyivatGmTDh48qNtuu837/rKyMiUlJam0tFRbtmzRiy++qOXLl2vatGnePvv371dSUpJ69+6tnJwcjR8/XikpKVq/fv1F2mUAAGB3fsYY82s2EBYWpjlz5uh3v/udmjdvrlWrVul3v/udJGnPnj3q0KGDsrKy1KNHD73zzju6+eabdfDgQUVEREiSFi1apMmTJ+vw4cMKCgrS5MmTlZ6ers8//9z7GUOGDFFBQYHWrVt33nV5PB6FhoaqsLBQTqfz1+yiLnkw/Ve9/2L6dlaS1SUAAFBlzvfv9wVfA1NWVqbVq1eruLhYLpdL2dnZOnnypBISErx92rdvr5YtWyorK0uSlJWVpU6dOnnDiyQlJibK4/F4j+JkZWX5bON0n9PbOJuSkhJ5PB6fBQAA1E6VDjC7du1Sw4YN5XA4NGbMGL322muKjY2V2+1WUFCQGjdu7NM/IiJCbrdbkuR2u33Cy+n2023n6uPxeHT8+PGz1jVz5kyFhoZ6l5iYmMruGgAAsIlKB5h27dopJydHn3zyicaOHavk5GR98cUXVVFbpUyZMkWFhYXe5cCBA1aXBAAAqkhgZd8QFBSkNm3aSJLi4+O1bds2zZ8/X3fccYdKS0tVUFDgcxQmLy9PkZGRkqTIyEht3brVZ3un71L6aZ+f37mUl5cnp9Op4ODgs9blcDjkcDgquzsAAMCGfvU8MOXl5SopKVF8fLzq1aunzMxMb9vevXuVm5srl8slSXK5XNq1a5fy8/O9fTIyMuR0OhUbG+vt89NtnO5zehsAAACVOgIzZcoU9e/fXy1btlRRUZFWrVqljRs3av369QoNDdWoUaOUlpamsLAwOZ1O3XvvvXK5XOrRo4ckqW/fvoqNjdXw4cM1e/Zsud1uTZ06Vampqd6jJ2PGjNFzzz2nSZMmaeTIkdqwYYNefvllpafXnDuBAACAtSoVYPLz8zVixAgdOnRIoaGhiouL0/r163XjjTdKkubOnSt/f38NHjxYJSUlSkxM1MKFC73vDwgI0Nq1azV27Fi5XC41aNBAycnJmjFjhrdP69atlZ6ergkTJmj+/Plq0aKFlixZosTExIu0ywAAwO5+9TwwNRXzwAAAYD9VPg8MAACAVQgwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdggwAADAdgKtLgD2dcmD6VaX4OPbWUlWlwAAqCYcgQEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALbDPDBAFWCOHACoWpU6AjNz5kxdddVVatSokcLDwzVo0CDt3bvXp0+vXr3k5+fns4wZM8anT25urpKSkhQSEqLw8HBNnDhRp06d8umzceNGdevWTQ6HQ23atNHy5csvbA8BAECtU6kAs2nTJqWmpurjjz9WRkaGTp48qb59+6q4uNin3z333KNDhw55l9mzZ3vbysrKlJSUpNLSUm3ZskUvvviili9frmnTpnn77N+/X0lJSerdu7dycnI0fvx4paSkaP369b9ydwEAQG1QqVNI69at83m9fPlyhYeHKzs7Wz179vSuDwkJUWRkZIXbePfdd/XFF1/ovffeU0REhLp06aLHHntMkydP1qOPPqqgoCAtWrRIrVu31lNPPSVJ6tChgz788EPNnTtXiYmJld1HAABQy/yqi3gLCwslSWFhYT7rV65cqWbNmqljx46aMmWKjh075m3LyspSp06dFBER4V2XmJgoj8ej3bt3e/skJCT4bDMxMVFZWVlnraWkpEQej8dnAQAAtdMFX8RbXl6u8ePH65prrlHHjh296++88061atVK0dHR2rlzpyZPnqy9e/fq1VdflSS53W6f8CLJ+9rtdp+zj8fj0fHjxxUcHHxGPTNnztT06dMvdHcAAICNXHCASU1N1eeff64PP/zQZ/3o0aO9/+7UqZOioqLUp08f7du3T5dddtmFV/oLpkyZorS0NO9rj8ejmJiYKvs8AABgnQs6hTRu3DitXbtW77//vlq0aHHOvt27d5ckff3115KkyMhI5eXl+fQ5/fr0dTNn6+N0Ois8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lb6N+tNPP1Xv3r29r0+HiuTkZC1fvlyTJk1ScXGxRo8erYKCAl177bVat26d6tev733PypUrNW7cOPXp00f+/v4aPHiwnnnmGW97aGio3n33XaWmpio+Pl7NmjXTtGnTuIUaAABIuoAA06tXLxljztru5+enGTNmaMaMGWftExYWplWrVp3zc+Li4vTBBx9UtjwAAFAH1Jq7kAAAQN1BgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZDgAEAALZz0QPMo48+Kj8/P5+lffv23vYTJ04oNTVVTZs2VcOGDTV48GDl5eX5bCM3N1dJSUkKCQlReHi4Jk6cqFOnTl3sUgEAgE0FVsVGr7jiCr333nv/9yGB//cxEyZMUHp6ul555RWFhoZq3Lhxuu222/TRRx9JksrKypSUlKTIyEht2bJFhw4d0ogRI1SvXj395S9/qYpyAQCAzVRJgAkMDFRkZOQZ6wsLC7V06VKtWrVKN9xwgyTphRdeUIcOHfTxxx+rR48eevfdd/XFF1/ovffeU0REhLp06aLHHntMkydP1qOPPqqgoKCqKBkAANhIlVwD89VXXyk6OlqXXnqphg0bptzcXElSdna2Tp48qYSEBG/f9u3bq2XLlsrKypIkZWVlqVOnToqIiPD2SUxMlMfj0e7du8/6mSUlJfJ4PD4LAAConS56gOnevbuWL1+udevW6fnnn9f+/ft13XXXqaioSG63W0FBQWrcuLHPeyIiIuR2uyVJbrfbJ7ycbj/ddjYzZ85UaGiod4mJibm4OwYAAGqMi34KqX///t5/x8XFqXv37mrVqpVefvllBQcHX+yP85oyZYrS0tK8rz0eDyEGAIBaqspvo27cuLEuv/xyff3114qMjFRpaakKCgp8+uTl5XmvmYmMjDzjrqTTryu6ruY0h8Mhp9PpswAAgNqpygPM0aNHtW/fPkVFRSk+Pl716tVTZmamt33v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99/33oFT1yxatOiMmwN+6uTJk3X2CNXUqVN100036aGHHtKLL76op556Srfeeqv+8pe/6He/+53V5Vlq5cqV8vc/+8mXiIgIDRkypBorunDchXSRnZ4S/2z8/Pw0ffp0/elPf6rGqoDapaioSC+99JKWLFmi7OzsOnkX0oYNG3T99dcz30sFmjZtqg8++ECxsbE6fvy4GjZsqFdffVUDBw60urQay47fKY7AXGTvv/++jDG64YYb9K9//cvnwYRBQUFq1aqVoqOjLawQsK/Nmzdr6dKl+te//qXo6GjddtttWrBggdVlWSIlJUUFBQXq16+fBg4cqP79+8vpdFpdVo3w3//+1/vssODgYIWEhHgfGAtfdv5OEWAusuuvv16StH//fjmdTi1btkxffvmlpB8PecfGxlpZXo3RtWvXCo9U+fn5qX79+mrTpo3uuusu9e7d24LqrMO4nMntdmv58uVaunSpPB6Pbr/9dpWUlOj111+v09+nb775Rjt37tSbb76pp556SnfddZeuvfZa3XLLLRo4cKCtZlStCl988YXcbrekH2cn3rt3r89TmCWd8bDHuqK2fKe4C6mKHD58WG3bttXcuXN15MgRHTlyRE8//bQuu+wybd++3eryLNevXz998803atCggXr37q3evXurYcOG2rdvn6666iodOnRICQkJeuONN6wutVoxLr4GDBigdu3aaefOnZo3b54OHjyoZ5991uqyaoy4uDhNnTpVW7du1b59+zR48GC98847ateunbp06aJp06bp008/tbpMS/Tp00ddunRRly5ddOzYMd18883e1126dFHXrl2tLtEStek7xTUwVeS6665TmzZttHjxYgUG/nig69SpU0pJSdE333xz1ifs1hX33HOPWrZsqYcffthn/eOPP67vvvtOixcv1iOPPKL09PQ69QuYcfEVGBio++67T2PHjlXbtm296+vVq6cdO3bY6n+L1am4uFjr1q3TG2+8obfffltpaWl66KGHrC6r2nz33Xe/2KeoqKhOnlaqVd8p626Aqt1+PqnUabt37zbBwcEWVFSzOJ1O89VXX52x/quvvjJOp9MYY8yXX35pGjZsWN2lWYpx8ZWVlWVSUlJMo0aNzNVXX22effZZc/jwYRMYGGh2795tdXm2cOrUKZOfn291GTWCx+Mxf/3rX83VV19dZ2+/r03fKU4hVRGn06nc3Nwz1h84cMBnsqm6qn79+tqyZcsZ67ds2eK99by8vLzOPaGacfHVo0cPLV68WIcOHdIf/vAHrV69WtHR0SovL1dGRkaFk0XWJd9//71mz56tW2+9VS6XSy6XS7feeqtmz57tnawsICBAzZs3t7hSa23evFnJycmKiorSk08+qd69e+vjjz+2uixL1KrvlNUJqra69957TYsWLczq1atNbm6uyc3NNS+99JJp0aKF+eMf/2h1eZZ77LHHTHBwsLnvvvvMihUrzIoVK8x9991nQkJCzOOPP26MMebpp582CQkJFldavRiXX7Znzx4zceJEExkZaerXr28GDBhgdUmW2Lp1q2nSpIn5zW9+Y5KTk82kSZPMpEmTTHJysmnRooUJCwsz27Zts7pMyxw6dMjMnDnTtGnTxoSHh5tx48bZ8ihDdbDrd4oAU0VKSkrMfffdZ4KCgoy/v7/x9/c3DofDjB8/3pw4ccLq8mqEf/zjH6ZHjx6mSZMmpkmTJqZHjx4+D+47duyYOX78uIUVWoNxOT+nTp0yr732mm1+2V5s3bt3N6NHjzbl5eVntJWXl5vRo0ebHj16WFCZ9W6++WbjdDrN0KFDzdq1a82pU6eMMYYA8wvs9p3iIt4qduzYMe3bt0+SdNlllykkJMTiigDUBsHBwfrss8/Uvn37Ctv37Nmjrl276vjx49VcmfVq1YWqOCvmgaliISEh6tSpk9Vl1FilpaXKz89XeXm5z/q6PocF44JfEhkZqa1bt541wGzdulURERHVXFXN8OGHH2rp0qWKj49Xhw4dNHz4cNtMj4/zR4CBJb766iuNHDnyjAtWjTHy8/OzxTTWVYFxwfl64IEHNHr0aGVnZ6tPnz7esJKXl6fMzEwtXrxYTz75pMVVWqNHjx7q0aOH5s2bpzVr1mjZsmVKS0vzXqgaExPDzRS1AKeQYIlrrrlGgYGBevDBBxUVFXXG7LOdO3e2qDJrMS6ojDVr1mju3Lk+z64JCAhQfHy80tLSdPvtt1tcYc2xd+9eLV26VCtWrFBBQYFuvPFGvfnmm1aXhV+BAANLNGjQQNnZ2Wc9/F1XMS64ECdPntT3338vSWrWrNk5n1Jd15WVlemtt97SsmXLCDA2xykkWCI2Ntb7Cxf/h3HBhahXr56ioqKsLsMWAgICNGjQIA0aNMjqUvArMZEdLPHEE09o0qRJ2rhxo3744Qd5PB6fpa5iXFAZO3bs0OOPP66FCxeeEXw9Ho9GjhxpUWVA1eMUEizh7/9jdv75NR51/WJVxgXn691339WAAQPUtm1bFRUVqbi4WK+88or3SeV5eXmKjo7mZwa1FqeQYIn333/f6hJqJMYF5+vRRx/VAw88oD//+c8yxmjOnDm65ZZb9Morr6hfv35WlwdUOY7AAIANhYaGavv27brsssu861atWqXRo0dr9erVuuqqqzgCg1qNIzCoNjt37lTHjh3l7++vnTt3nrNvXFxcNVVlPcYFF8LhcKigoMBn3Z133il/f3/dcccdeuqpp6wpDKgmHIFBtfH395fb7VZ4eLj8/f3l5+enin786tq1HowLLkTfvn3Vt29fPfDAA2e0vfTSS0pOTlZZWRk/M6i1OAKDarN//341b97c+2/8iHHBhRg7dqw2b95cYdvQoUNljNHixYuruSqg+nAEBgAA2A7zwMAyK1as0DXXXKPo6Gh99913kqR58+bpjTfesLgyazEu+DXy8vKUm5trdRlAlSPAwBLPP/+80tLSdNNNN6mgoMB7nr5x48aaN2+etcVZiHHB+SoqKtLvf/97tWrVSsnJySotLVVqaqqioqLUunVrXX/99Ux+iFqNAANLPPvss1q8eLH+9Kc/KSAgwLv+yiuv1K5duyyszFqMC87XQw89pOzsbD3wwAPKzc3V7bffrs2bN+uDDz7Q+++/r++//15PPPGE1WUCVYaLeGGJ/fv3q2vXrmesdzgcKi4utqCimoFxwfl644039OKLL6p3794aPHiwWrRooTfffFPXXHONJGn27Nm6//779ec//9niSoGqwREYWKJ169bKyck5Y/26devUoUOH6i+ohmBccL7y8/PVpk0bSVJ0dLSCg4N1+eWXe9s7duyoAwcOWFUeUOU4AgNLpKWlKTU1VSdOnJAxRlu3btVLL72kmTNnasmSJVaXZxnGBeeradOmOnz4sGJiYiRJAwcOVOPGjb3tR48elcPhsKg6oOoRYGCJlJQUBQcHa+rUqTp27JjuvPNORUdHa/78+RoyZIjV5VmGccH5iouL07Zt29StWzdJPz5G4Ke2bdvGUTvUaswDA8sdO3ZMR48eVXh4uNWl1CiMC87lyJEj8vf39znq8lPvvPOOvv76a917773VWxhQTQgwsNThw4e1d+9eSVL79u3VrFkziyuqGRgXXKiioiK99NJLWrJkibKzs3mUAGotLuKFJYqLizVy5EhFRUWpZ8+e6tmzp6KiojRq1CgdO3bM6vIsw7jgQm3evFnJycmKiorSk08+qRtuuEEff/yx1WUBVYYAA0ukpaVp06ZNeuutt1RQUKCCggK98cYb2rRpk+6//36ry7MM44LKcLvdmjVrltq2bav/+Z//kdPpVElJiV5//XXNmjVLV111ldUlAlWGU0iwRLNmzfTPf/5TvXr18ln//vvv6/bbb9fhw4etKcxijAvO14ABA7R582YlJSVp2LBh6tevnwICAlSvXj3t2LFDsbGxVpcIVCnuQoIljh07poiIiDPWh4eH1+lTJYwLztc777yj++67T2PHjlXbtm2tLgeodpxCgiVcLpceeeQRnThxwrvu+PHjmj59ulwul4WVWYtxwfn68MMPVVRUpPj4eHXv3l3PPfecvv/+e6vLAqoNp5Bgic8//1yJiYkqKSlR586dJUk7duyQw+HQu+++qyuuuMLiCq3BuKCyiouLtWbNGi1btkxbt25VWVmZnn76aY0cOVKNGjWyujygyhBgYJljx45p5cqV2rNnjySpQ4cOGjZsmIKDgy2uzFqMCy7U3r17tXTpUq1YsUIFBQW68cYb9eabb1pdFlAlCDCwxA8//KCmTZtKknJzc7VkyRIdP35ct9xyi6677jqLq7MO44KLoaysTG+99ZaWLVtGgEGtRYBBtdq1a5cGDBigAwcOqG3btlq9erX69eun4uJi+fv7q7i4WP/85z81aNAgq0utVowLAFQOF/GiWk2aNEmdOnXS5s2b1atXL918881KSkpSYWGh/vvf/+oPf/iDZs2aZXWZ1Y5xAYDK4QgMqlWzZs20YcMGxcXF6ejRo3I6ndq2bZvi4+MlSXv27FGPHj1UUFBgbaHVjHEBgMrhCAyq1ZEjRxQZGSlJatiwoRo0aKAmTZp425s0aaKioiKryrMM4wIAlUOAQbXz8/M75+u6inEBgPPHTLyodnfddZccDock6cSJExozZowaNGggSSopKbGyNEsxLgBw/rgGBtXq7rvvPq9+L7zwQhVXUrMwLgBQOQQYAABgO1wDAwAAbIcAAwAAbIcAAwAAbIcAAwAAbIcAAwAAbIcAAwAAbIcAAwAAbIcAAwAAbOf/A/6KPKRDbqDUAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 不同类别的分布情况\n",
    "remaining_df['class'].value_counts().plot(kind='bar')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "04a93b5c-cd00-4d57-aaca-ce5d814f56d9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of filenames that contain A330: 290\n"
     ]
    }
   ],
   "source": [
    "# 找出所有包含 A330 的 filename\n",
    "# 使用 groupby 和 any 方法来检查每个分组中是否有 A330 类别\n",
    "filtered_filenames_A330 = df_labels[df_labels['class'] == 'A330']['filename'].unique()\n",
    "\n",
    "# 或者使用 groupby 和 any 方法\n",
    "# filtered_filenames_A330 = df_labels.groupby('filename').filter(lambda x: (x['class'] == 'A330').any())['filename'].unique()\n",
    "\n",
    "# 打印结果\n",
    "print(f\"Number of filenames that contain A330: {len(filtered_filenames_A330)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "217729fe-5c8b-4ee6-8bd0-e7727859b875",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 要划分的源数据集图片路径\n",
    "src_img_root = os.path.join(\".\", \"sar_aircraft_source\", \"JPEGImages\")\n",
    "# 要划分的源数据集标注路径\n",
    "src_label_root = os.path.join(\".\", \"sar_aircraft_source\", \"Annotations\")\n",
    "# 目标数据集图片路径\n",
    "target_img_root = os.path.join(\"E:\\\\\", \"datasets\", \"sar_aircraft_remaining\", \"images\")\n",
    "# 目标数据集标注路径\n",
    "target_label_root = os.path.join(\"E:\\\\\", \"datasets\", \"sar_aircraft_remaining\", \"labels\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "21d6b135-61d1-4afe-8def-86698d7caf89",
   "metadata": {},
   "outputs": [],
   "source": [
    "A330_image_target_dir = r'.\\A330_images'\n",
    "A330_label_target_dir = r'.\\A330_labels'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "5fe7b8bb-fd7b-42cb-bee0-3ce46eabb4a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 确保目标文件夹存在\n",
    "os.makedirs(A330_image_target_dir, exist_ok=True)\n",
    "os.makedirs(A330_label_target_dir, exist_ok=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "9f7e88b9-d8b3-4b42-9cf8-e177470093c1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Copied 0000003.jpg to .\\A330_images\n",
      "Copied 0000012.jpg to .\\A330_images\n",
      "Copied 0000027.jpg to .\\A330_images\n",
      "Copied 0000041.jpg to .\\A330_images\n",
      "Copied 0000048.jpg to .\\A330_images\n",
      "Copied 0000065.jpg to .\\A330_images\n",
      "Copied 0000135.jpg to .\\A330_images\n",
      "Copied 0000153.jpg to .\\A330_images\n",
      "Copied 0000158.jpg to .\\A330_images\n",
      "Copied 0000165.jpg to .\\A330_images\n",
      "Copied 0000188.jpg to .\\A330_images\n",
      "Copied 0000197.jpg to .\\A330_images\n",
      "Copied 0000199.jpg to .\\A330_images\n",
      "Copied 0000209.jpg to .\\A330_images\n",
      "Copied 0000214.jpg to .\\A330_images\n",
      "Copied 0000225.jpg to .\\A330_images\n",
      "Copied 0000238.jpg to .\\A330_images\n",
      "Copied 0000249.jpg to .\\A330_images\n",
      "Copied 0000253.jpg to .\\A330_images\n",
      "Copied 0000294.jpg to .\\A330_images\n",
      "Copied 0000320.jpg to .\\A330_images\n",
      "Copied 0000342.jpg to .\\A330_images\n",
      "Copied 0000360.jpg to .\\A330_images\n",
      "Copied 0000379.jpg to .\\A330_images\n",
      "Copied 0000385.jpg to .\\A330_images\n",
      "Copied 0000401.jpg to .\\A330_images\n",
      "Copied 0000402.jpg to .\\A330_images\n",
      "Copied 0000426.jpg to .\\A330_images\n",
      "Copied 0000434.jpg to .\\A330_images\n",
      "Copied 0000435.jpg to .\\A330_images\n",
      "Copied 0000468.jpg to .\\A330_images\n",
      "Copied 0000473.jpg to .\\A330_images\n",
      "Copied 0000474.jpg to .\\A330_images\n",
      "Copied 0000515.jpg to .\\A330_images\n",
      "Copied 0000534.jpg to .\\A330_images\n",
      "Copied 0000549.jpg to .\\A330_images\n",
      "Copied 0000556.jpg to .\\A330_images\n",
      "Copied 0000563.jpg to .\\A330_images\n",
      "Copied 0000566.jpg to .\\A330_images\n",
      "Copied 0000570.jpg to .\\A330_images\n",
      "Copied 0000578.jpg to .\\A330_images\n",
      "Copied 0000581.jpg to .\\A330_images\n",
      "Copied 0000605.jpg to .\\A330_images\n",
      "Copied 0000621.jpg to .\\A330_images\n",
      "Copied 0000641.jpg to .\\A330_images\n",
      "Copied 0000644.jpg to .\\A330_images\n",
      "Copied 0000649.jpg to .\\A330_images\n",
      "Copied 0000673.jpg to .\\A330_images\n",
      "Copied 0000676.jpg to .\\A330_images\n",
      "Copied 0000689.jpg to .\\A330_images\n",
      "Copied 0000694.jpg to .\\A330_images\n",
      "Copied 0000702.jpg to .\\A330_images\n",
      "Copied 0000708.jpg to .\\A330_images\n",
      "Copied 0000736.jpg to .\\A330_images\n",
      "Copied 0000751.jpg to .\\A330_images\n",
      "Copied 0000760.jpg to .\\A330_images\n",
      "Copied 0000764.jpg to .\\A330_images\n",
      "Copied 0000769.jpg to .\\A330_images\n",
      "Copied 0000777.jpg to .\\A330_images\n",
      "Copied 0000830.jpg to .\\A330_images\n",
      "Copied 0000833.jpg to .\\A330_images\n",
      "Copied 0000835.jpg to .\\A330_images\n",
      "Copied 0000842.jpg to .\\A330_images\n",
      "Copied 0000900.jpg to .\\A330_images\n",
      "Copied 0000908.jpg to .\\A330_images\n",
      "Copied 0000917.jpg to .\\A330_images\n",
      "Copied 0000918.jpg to .\\A330_images\n",
      "Copied 0000919.jpg to .\\A330_images\n",
      "Copied 0000951.jpg to .\\A330_images\n",
      "Copied 0000967.jpg to .\\A330_images\n",
      "Copied 0000968.jpg to .\\A330_images\n",
      "Copied 0000986.jpg to .\\A330_images\n",
      "Copied 0000989.jpg to .\\A330_images\n",
      "Copied 0001021.jpg to .\\A330_images\n",
      "Copied 0001036.jpg to .\\A330_images\n",
      "Copied 0001041.jpg to .\\A330_images\n",
      "Copied 0001052.jpg to .\\A330_images\n",
      "Copied 0001054.jpg to .\\A330_images\n",
      "Copied 0001056.jpg to .\\A330_images\n",
      "Copied 0001072.jpg to .\\A330_images\n",
      "Copied 0001080.jpg to .\\A330_images\n",
      "Copied 0001109.jpg to .\\A330_images\n",
      "Copied 0001111.jpg to .\\A330_images\n",
      "Copied 0001112.jpg to .\\A330_images\n",
      "Copied 0001126.jpg to .\\A330_images\n",
      "Copied 0001137.jpg to .\\A330_images\n",
      "Copied 0001144.jpg to .\\A330_images\n",
      "Copied 0001228.jpg to .\\A330_images\n",
      "Copied 0001262.jpg to .\\A330_images\n",
      "Copied 0001293.jpg to .\\A330_images\n",
      "Copied 0001325.jpg to .\\A330_images\n",
      "Copied 0001326.jpg to .\\A330_images\n",
      "Copied 0001329.jpg to .\\A330_images\n",
      "Copied 0001330.jpg to .\\A330_images\n",
      "Copied 0001338.jpg to .\\A330_images\n",
      "Copied 0001362.jpg to .\\A330_images\n",
      "Copied 0001368.jpg to .\\A330_images\n",
      "Copied 0001382.jpg to .\\A330_images\n",
      "Copied 0001409.jpg to .\\A330_images\n",
      "Copied 0001411.jpg to .\\A330_images\n",
      "Copied 0001416.jpg to .\\A330_images\n",
      "Copied 0001428.jpg to .\\A330_images\n",
      "Copied 0001440.jpg to .\\A330_images\n",
      "Copied 0001445.jpg to .\\A330_images\n",
      "Copied 0001454.jpg to .\\A330_images\n",
      "Copied 0001456.jpg to .\\A330_images\n",
      "Copied 0001457.jpg to .\\A330_images\n",
      "Copied 0001466.jpg to .\\A330_images\n",
      "Copied 0001467.jpg to .\\A330_images\n",
      "Copied 0001485.jpg to .\\A330_images\n",
      "Copied 0001518.jpg to .\\A330_images\n",
      "Copied 0001533.jpg to .\\A330_images\n",
      "Copied 0001545.jpg to .\\A330_images\n",
      "Copied 0001551.jpg to .\\A330_images\n",
      "Copied 0001567.jpg to .\\A330_images\n",
      "Copied 0001572.jpg to .\\A330_images\n",
      "Copied 0001576.jpg to .\\A330_images\n",
      "Copied 0001577.jpg to .\\A330_images\n",
      "Copied 0001620.jpg to .\\A330_images\n",
      "Copied 0001652.jpg to .\\A330_images\n",
      "Copied 0001664.jpg to .\\A330_images\n",
      "Copied 0001734.jpg to .\\A330_images\n",
      "Copied 0001741.jpg to .\\A330_images\n",
      "Copied 0001761.jpg to .\\A330_images\n",
      "Copied 0001788.jpg to .\\A330_images\n",
      "Copied 0001809.jpg to .\\A330_images\n",
      "Copied 0001812.jpg to .\\A330_images\n",
      "Copied 0001813.jpg to .\\A330_images\n",
      "Copied 0001892.jpg to .\\A330_images\n",
      "Copied 0001901.jpg to .\\A330_images\n",
      "Copied 0001904.jpg to .\\A330_images\n",
      "Copied 0001918.jpg to .\\A330_images\n",
      "Copied 0001944.jpg to .\\A330_images\n",
      "Copied 0001963.jpg to .\\A330_images\n",
      "Copied 0001970.jpg to .\\A330_images\n",
      "Copied 0001997.jpg to .\\A330_images\n",
      "Copied 0002020.jpg to .\\A330_images\n",
      "Copied 0002046.jpg to .\\A330_images\n",
      "Copied 0002085.jpg to .\\A330_images\n",
      "Copied 0002106.jpg to .\\A330_images\n",
      "Copied 0002116.jpg to .\\A330_images\n",
      "Copied 0002137.jpg to .\\A330_images\n",
      "Copied 0002222.jpg to .\\A330_images\n",
      "Copied 0002227.jpg to .\\A330_images\n",
      "Copied 0002274.jpg to .\\A330_images\n",
      "Copied 0002277.jpg to .\\A330_images\n",
      "Copied 0002297.jpg to .\\A330_images\n",
      "Copied 0002322.jpg to .\\A330_images\n",
      "Copied 0002328.jpg to .\\A330_images\n",
      "Copied 0002353.jpg to .\\A330_images\n",
      "Copied 0002356.jpg to .\\A330_images\n",
      "Copied 0002363.jpg to .\\A330_images\n",
      "Copied 0002394.jpg to .\\A330_images\n",
      "Copied 0002401.jpg to .\\A330_images\n",
      "Copied 0002420.jpg to .\\A330_images\n",
      "Copied 0002441.jpg to .\\A330_images\n",
      "Copied 0002463.jpg to .\\A330_images\n",
      "Copied 0002478.jpg to .\\A330_images\n",
      "Copied 0002491.jpg to .\\A330_images\n",
      "Copied 0002516.jpg to .\\A330_images\n",
      "Copied 0002520.jpg to .\\A330_images\n",
      "Copied 0002523.jpg to .\\A330_images\n",
      "Copied 0002527.jpg to .\\A330_images\n",
      "Copied 0002603.jpg to .\\A330_images\n",
      "Copied 0002610.jpg to .\\A330_images\n",
      "Copied 0002638.jpg to .\\A330_images\n",
      "Copied 0002655.jpg to .\\A330_images\n",
      "Copied 0002667.jpg to .\\A330_images\n",
      "Copied 0002683.jpg to .\\A330_images\n",
      "Copied 0002691.jpg to .\\A330_images\n",
      "Copied 0002699.jpg to .\\A330_images\n",
      "Copied 0002703.jpg to .\\A330_images\n",
      "Copied 0002706.jpg to .\\A330_images\n",
      "Copied 0002711.jpg to .\\A330_images\n",
      "Copied 0002712.jpg to .\\A330_images\n",
      "Copied 0002715.jpg to .\\A330_images\n",
      "Copied 0002724.jpg to .\\A330_images\n",
      "Copied 0002733.jpg to .\\A330_images\n",
      "Copied 0002753.jpg to .\\A330_images\n",
      "Copied 0002779.jpg to .\\A330_images\n",
      "Copied 0002782.jpg to .\\A330_images\n",
      "Copied 0002786.jpg to .\\A330_images\n",
      "Copied 0002804.jpg to .\\A330_images\n",
      "Copied 0002894.jpg to .\\A330_images\n",
      "Copied 0002908.jpg to .\\A330_images\n",
      "Copied 0002912.jpg to .\\A330_images\n",
      "Copied 0002919.jpg to .\\A330_images\n",
      "Copied 0002923.jpg to .\\A330_images\n",
      "Copied 0002926.jpg to .\\A330_images\n",
      "Copied 0002928.jpg to .\\A330_images\n",
      "Copied 0002955.jpg to .\\A330_images\n",
      "Copied 0002959.jpg to .\\A330_images\n",
      "Copied 0002961.jpg to .\\A330_images\n",
      "Copied 0002969.jpg to .\\A330_images\n",
      "Copied 0002985.jpg to .\\A330_images\n",
      "Copied 0002999.jpg to .\\A330_images\n",
      "Copied 0003000.jpg to .\\A330_images\n",
      "Copied 0003030.jpg to .\\A330_images\n",
      "Copied 0003037.jpg to .\\A330_images\n",
      "Copied 0003072.jpg to .\\A330_images\n",
      "Copied 0003080.jpg to .\\A330_images\n",
      "Copied 0003111.jpg to .\\A330_images\n",
      "Copied 0003121.jpg to .\\A330_images\n",
      "Copied 0003129.jpg to .\\A330_images\n",
      "Copied 0003131.jpg to .\\A330_images\n",
      "Copied 0003148.jpg to .\\A330_images\n",
      "Copied 0003232.jpg to .\\A330_images\n",
      "Copied 0003235.jpg to .\\A330_images\n",
      "Copied 0003290.jpg to .\\A330_images\n",
      "Copied 0003309.jpg to .\\A330_images\n",
      "Copied 0003316.jpg to .\\A330_images\n",
      "Copied 0003324.jpg to .\\A330_images\n",
      "Copied 0003338.jpg to .\\A330_images\n",
      "Copied 0003339.jpg to .\\A330_images\n",
      "Copied 0003351.jpg to .\\A330_images\n",
      "Copied 0003353.jpg to .\\A330_images\n",
      "Copied 0003355.jpg to .\\A330_images\n",
      "Copied 0003365.jpg to .\\A330_images\n",
      "Copied 0003373.jpg to .\\A330_images\n",
      "Copied 0003377.jpg to .\\A330_images\n",
      "Copied 0003382.jpg to .\\A330_images\n",
      "Copied 0003393.jpg to .\\A330_images\n",
      "Copied 0003394.jpg to .\\A330_images\n",
      "Copied 0003401.jpg to .\\A330_images\n",
      "Copied 0003440.jpg to .\\A330_images\n",
      "Copied 0003463.jpg to .\\A330_images\n",
      "Copied 0003508.jpg to .\\A330_images\n",
      "Copied 0003511.jpg to .\\A330_images\n",
      "Copied 0003515.jpg to .\\A330_images\n",
      "Copied 0003517.jpg to .\\A330_images\n",
      "Copied 0003535.jpg to .\\A330_images\n",
      "Copied 0003541.jpg to .\\A330_images\n",
      "Copied 0003544.jpg to .\\A330_images\n",
      "Copied 0003545.jpg to .\\A330_images\n",
      "Copied 0003555.jpg to .\\A330_images\n",
      "Copied 0003575.jpg to .\\A330_images\n",
      "Copied 0003614.jpg to .\\A330_images\n",
      "Copied 0003642.jpg to .\\A330_images\n",
      "Copied 0003643.jpg to .\\A330_images\n",
      "Copied 0003651.jpg to .\\A330_images\n",
      "Copied 0003668.jpg to .\\A330_images\n",
      "Copied 0003730.jpg to .\\A330_images\n",
      "Copied 0003787.jpg to .\\A330_images\n",
      "Copied 0003802.jpg to .\\A330_images\n",
      "Copied 0003817.jpg to .\\A330_images\n",
      "Copied 0003818.jpg to .\\A330_images\n",
      "Copied 0003853.jpg to .\\A330_images\n",
      "Copied 0003869.jpg to .\\A330_images\n",
      "Copied 0003881.jpg to .\\A330_images\n",
      "Copied 0003891.jpg to .\\A330_images\n",
      "Copied 0003922.jpg to .\\A330_images\n",
      "Copied 0003928.jpg to .\\A330_images\n",
      "Copied 0003933.jpg to .\\A330_images\n",
      "Copied 0003935.jpg to .\\A330_images\n",
      "Copied 0003938.jpg to .\\A330_images\n",
      "Copied 0003939.jpg to .\\A330_images\n",
      "Copied 0003961.jpg to .\\A330_images\n",
      "Copied 0003966.jpg to .\\A330_images\n",
      "Copied 0003971.jpg to .\\A330_images\n",
      "Copied 0004005.jpg to .\\A330_images\n",
      "Copied 0004006.jpg to .\\A330_images\n",
      "Copied 0004014.jpg to .\\A330_images\n",
      "Copied 0004020.jpg to .\\A330_images\n",
      "Copied 0004033.jpg to .\\A330_images\n",
      "Copied 0004061.jpg to .\\A330_images\n",
      "Copied 0004074.jpg to .\\A330_images\n",
      "Copied 0004076.jpg to .\\A330_images\n",
      "Copied 0004079.jpg to .\\A330_images\n",
      "Copied 0004093.jpg to .\\A330_images\n",
      "Copied 0004104.jpg to .\\A330_images\n",
      "Copied 0004107.jpg to .\\A330_images\n",
      "Copied 0004136.jpg to .\\A330_images\n",
      "Copied 0004141.jpg to .\\A330_images\n",
      "Copied 0004143.jpg to .\\A330_images\n",
      "Copied 0004171.jpg to .\\A330_images\n",
      "Copied 0004173.jpg to .\\A330_images\n",
      "Copied 0004183.jpg to .\\A330_images\n",
      "Copied 0004184.jpg to .\\A330_images\n",
      "Copied 0004209.jpg to .\\A330_images\n",
      "Copied 0004242.jpg to .\\A330_images\n",
      "Copied 0004254.jpg to .\\A330_images\n",
      "Copied 0004256.jpg to .\\A330_images\n",
      "Copied 0004282.jpg to .\\A330_images\n",
      "Copied 0004290.jpg to .\\A330_images\n",
      "Copied 0004315.jpg to .\\A330_images\n",
      "Copied 0004327.jpg to .\\A330_images\n",
      "Copied 0004348.jpg to .\\A330_images\n",
      "Copied 0004354.jpg to .\\A330_images\n",
      "Copied 0004365.jpg to .\\A330_images\n",
      "Copied 0004366.jpg to .\\A330_images\n"
     ]
    }
   ],
   "source": [
    "import shutil\n",
    "# 拷贝图片文件\n",
    "for filename in filtered_filenames_A330:\n",
    "    image_source_path = os.path.join(src_img_root, filename)\n",
    "    image_target_path = os.path.join(A330_image_target_dir, filename)\n",
    "    if os.path.exists(image_source_path):\n",
    "        shutil.copy(image_source_path, image_target_path)\n",
    "        print(f\"Copied {filename} to {A330_image_target_dir}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "8d593a74-0bb5-489a-b997-be8ebd2118d1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Copied 0000003.txt to .\\A330_labels\n",
      "Copied 0000012.txt to .\\A330_labels\n",
      "Copied 0000027.txt to .\\A330_labels\n",
      "Copied 0000041.txt to .\\A330_labels\n",
      "Copied 0000048.txt to .\\A330_labels\n",
      "Copied 0000065.txt to .\\A330_labels\n",
      "Copied 0000135.txt to .\\A330_labels\n",
      "Copied 0000153.txt to .\\A330_labels\n",
      "Copied 0000158.txt to .\\A330_labels\n",
      "Copied 0000165.txt to .\\A330_labels\n",
      "Copied 0000188.txt to .\\A330_labels\n",
      "Copied 0000197.txt to .\\A330_labels\n",
      "Copied 0000199.txt to .\\A330_labels\n",
      "Copied 0000209.txt to .\\A330_labels\n",
      "Copied 0000214.txt to .\\A330_labels\n",
      "Copied 0000225.txt to .\\A330_labels\n",
      "Copied 0000238.txt to .\\A330_labels\n",
      "Copied 0000249.txt to .\\A330_labels\n",
      "Copied 0000253.txt to .\\A330_labels\n",
      "Copied 0000294.txt to .\\A330_labels\n",
      "Copied 0000320.txt to .\\A330_labels\n",
      "Copied 0000342.txt to .\\A330_labels\n",
      "Copied 0000360.txt to .\\A330_labels\n",
      "Copied 0000379.txt to .\\A330_labels\n",
      "Copied 0000385.txt to .\\A330_labels\n",
      "Copied 0000401.txt to .\\A330_labels\n",
      "Copied 0000402.txt to .\\A330_labels\n",
      "Copied 0000426.txt to .\\A330_labels\n",
      "Copied 0000434.txt to .\\A330_labels\n",
      "Copied 0000435.txt to .\\A330_labels\n",
      "Copied 0000468.txt to .\\A330_labels\n",
      "Copied 0000473.txt to .\\A330_labels\n",
      "Copied 0000474.txt to .\\A330_labels\n",
      "Copied 0000515.txt to .\\A330_labels\n",
      "Copied 0000534.txt to .\\A330_labels\n",
      "Copied 0000549.txt to .\\A330_labels\n",
      "Copied 0000556.txt to .\\A330_labels\n",
      "Copied 0000563.txt to .\\A330_labels\n",
      "Copied 0000566.txt to .\\A330_labels\n",
      "Copied 0000570.txt to .\\A330_labels\n",
      "Copied 0000578.txt to .\\A330_labels\n",
      "Copied 0000581.txt to .\\A330_labels\n",
      "Copied 0000605.txt to .\\A330_labels\n",
      "Copied 0000621.txt to .\\A330_labels\n",
      "Copied 0000641.txt to .\\A330_labels\n",
      "Copied 0000644.txt to .\\A330_labels\n",
      "Copied 0000649.txt to .\\A330_labels\n",
      "Copied 0000673.txt to .\\A330_labels\n",
      "Copied 0000676.txt to .\\A330_labels\n",
      "Copied 0000689.txt to .\\A330_labels\n",
      "Copied 0000694.txt to .\\A330_labels\n",
      "Copied 0000702.txt to .\\A330_labels\n",
      "Copied 0000708.txt to .\\A330_labels\n",
      "Copied 0000736.txt to .\\A330_labels\n",
      "Copied 0000751.txt to .\\A330_labels\n",
      "Copied 0000760.txt to .\\A330_labels\n",
      "Copied 0000764.txt to .\\A330_labels\n",
      "Copied 0000769.txt to .\\A330_labels\n",
      "Copied 0000777.txt to .\\A330_labels\n",
      "Copied 0000830.txt to .\\A330_labels\n",
      "Copied 0000833.txt to .\\A330_labels\n",
      "Copied 0000835.txt to .\\A330_labels\n",
      "Copied 0000842.txt to .\\A330_labels\n",
      "Copied 0000900.txt to .\\A330_labels\n",
      "Copied 0000908.txt to .\\A330_labels\n",
      "Copied 0000917.txt to .\\A330_labels\n",
      "Copied 0000918.txt to .\\A330_labels\n",
      "Copied 0000919.txt to .\\A330_labels\n",
      "Copied 0000951.txt to .\\A330_labels\n",
      "Copied 0000967.txt to .\\A330_labels\n",
      "Copied 0000968.txt to .\\A330_labels\n",
      "Copied 0000986.txt to .\\A330_labels\n",
      "Copied 0000989.txt to .\\A330_labels\n",
      "Copied 0001021.txt to .\\A330_labels\n",
      "Copied 0001036.txt to .\\A330_labels\n",
      "Copied 0001041.txt to .\\A330_labels\n",
      "Copied 0001052.txt to .\\A330_labels\n",
      "Copied 0001054.txt to .\\A330_labels\n",
      "Copied 0001056.txt to .\\A330_labels\n",
      "Copied 0001072.txt to .\\A330_labels\n",
      "Copied 0001080.txt to .\\A330_labels\n",
      "Copied 0001109.txt to .\\A330_labels\n",
      "Copied 0001111.txt to .\\A330_labels\n",
      "Copied 0001112.txt to .\\A330_labels\n",
      "Copied 0001126.txt to .\\A330_labels\n",
      "Copied 0001137.txt to .\\A330_labels\n",
      "Copied 0001144.txt to .\\A330_labels\n",
      "Copied 0001228.txt to .\\A330_labels\n",
      "Copied 0001262.txt to .\\A330_labels\n",
      "Copied 0001293.txt to .\\A330_labels\n",
      "Copied 0001325.txt to .\\A330_labels\n",
      "Copied 0001326.txt to .\\A330_labels\n",
      "Copied 0001329.txt to .\\A330_labels\n",
      "Copied 0001330.txt to .\\A330_labels\n",
      "Copied 0001338.txt to .\\A330_labels\n",
      "Copied 0001362.txt to .\\A330_labels\n",
      "Copied 0001368.txt to .\\A330_labels\n",
      "Copied 0001382.txt to .\\A330_labels\n",
      "Copied 0001409.txt to .\\A330_labels\n",
      "Copied 0001411.txt to .\\A330_labels\n",
      "Copied 0001416.txt to .\\A330_labels\n",
      "Copied 0001428.txt to .\\A330_labels\n",
      "Copied 0001440.txt to .\\A330_labels\n",
      "Copied 0001445.txt to .\\A330_labels\n",
      "Copied 0001454.txt to .\\A330_labels\n",
      "Copied 0001456.txt to .\\A330_labels\n",
      "Copied 0001457.txt to .\\A330_labels\n",
      "Copied 0001466.txt to .\\A330_labels\n",
      "Copied 0001467.txt to .\\A330_labels\n",
      "Copied 0001485.txt to .\\A330_labels\n",
      "Copied 0001518.txt to .\\A330_labels\n",
      "Copied 0001533.txt to .\\A330_labels\n",
      "Copied 0001545.txt to .\\A330_labels\n",
      "Copied 0001551.txt to .\\A330_labels\n",
      "Copied 0001567.txt to .\\A330_labels\n",
      "Copied 0001572.txt to .\\A330_labels\n",
      "Copied 0001576.txt to .\\A330_labels\n",
      "Copied 0001577.txt to .\\A330_labels\n",
      "Copied 0001620.txt to .\\A330_labels\n",
      "Copied 0001652.txt to .\\A330_labels\n",
      "Copied 0001664.txt to .\\A330_labels\n",
      "Copied 0001734.txt to .\\A330_labels\n",
      "Copied 0001741.txt to .\\A330_labels\n",
      "Copied 0001761.txt to .\\A330_labels\n",
      "Copied 0001788.txt to .\\A330_labels\n",
      "Copied 0001809.txt to .\\A330_labels\n",
      "Copied 0001812.txt to .\\A330_labels\n",
      "Copied 0001813.txt to .\\A330_labels\n",
      "Copied 0001892.txt to .\\A330_labels\n",
      "Copied 0001901.txt to .\\A330_labels\n",
      "Copied 0001904.txt to .\\A330_labels\n",
      "Copied 0001918.txt to .\\A330_labels\n",
      "Copied 0001944.txt to .\\A330_labels\n",
      "Copied 0001963.txt to .\\A330_labels\n",
      "Copied 0001970.txt to .\\A330_labels\n",
      "Copied 0001997.txt to .\\A330_labels\n",
      "Copied 0002020.txt to .\\A330_labels\n",
      "Copied 0002046.txt to .\\A330_labels\n",
      "Copied 0002085.txt to .\\A330_labels\n",
      "Copied 0002106.txt to .\\A330_labels\n",
      "Copied 0002116.txt to .\\A330_labels\n",
      "Copied 0002137.txt to .\\A330_labels\n",
      "Copied 0002222.txt to .\\A330_labels\n",
      "Copied 0002227.txt to .\\A330_labels\n",
      "Copied 0002274.txt to .\\A330_labels\n",
      "Copied 0002277.txt to .\\A330_labels\n",
      "Copied 0002297.txt to .\\A330_labels\n",
      "Copied 0002322.txt to .\\A330_labels\n",
      "Copied 0002328.txt to .\\A330_labels\n",
      "Copied 0002353.txt to .\\A330_labels\n",
      "Copied 0002356.txt to .\\A330_labels\n",
      "Copied 0002363.txt to .\\A330_labels\n",
      "Copied 0002394.txt to .\\A330_labels\n",
      "Copied 0002401.txt to .\\A330_labels\n",
      "Copied 0002420.txt to .\\A330_labels\n",
      "Copied 0002441.txt to .\\A330_labels\n",
      "Copied 0002463.txt to .\\A330_labels\n",
      "Copied 0002478.txt to .\\A330_labels\n",
      "Copied 0002491.txt to .\\A330_labels\n",
      "Copied 0002516.txt to .\\A330_labels\n",
      "Copied 0002520.txt to .\\A330_labels\n",
      "Copied 0002523.txt to .\\A330_labels\n",
      "Copied 0002527.txt to .\\A330_labels\n",
      "Copied 0002603.txt to .\\A330_labels\n",
      "Copied 0002610.txt to .\\A330_labels\n",
      "Copied 0002638.txt to .\\A330_labels\n",
      "Copied 0002655.txt to .\\A330_labels\n",
      "Copied 0002667.txt to .\\A330_labels\n",
      "Copied 0002683.txt to .\\A330_labels\n",
      "Copied 0002691.txt to .\\A330_labels\n",
      "Copied 0002699.txt to .\\A330_labels\n",
      "Copied 0002703.txt to .\\A330_labels\n",
      "Copied 0002706.txt to .\\A330_labels\n",
      "Copied 0002711.txt to .\\A330_labels\n",
      "Copied 0002712.txt to .\\A330_labels\n",
      "Copied 0002715.txt to .\\A330_labels\n",
      "Copied 0002724.txt to .\\A330_labels\n",
      "Copied 0002733.txt to .\\A330_labels\n",
      "Copied 0002753.txt to .\\A330_labels\n",
      "Copied 0002779.txt to .\\A330_labels\n",
      "Copied 0002782.txt to .\\A330_labels\n",
      "Copied 0002786.txt to .\\A330_labels\n",
      "Copied 0002804.txt to .\\A330_labels\n",
      "Copied 0002894.txt to .\\A330_labels\n",
      "Copied 0002908.txt to .\\A330_labels\n",
      "Copied 0002912.txt to .\\A330_labels\n",
      "Copied 0002919.txt to .\\A330_labels\n",
      "Copied 0002923.txt to .\\A330_labels\n",
      "Copied 0002926.txt to .\\A330_labels\n",
      "Copied 0002928.txt to .\\A330_labels\n",
      "Copied 0002955.txt to .\\A330_labels\n",
      "Copied 0002959.txt to .\\A330_labels\n",
      "Copied 0002961.txt to .\\A330_labels\n",
      "Copied 0002969.txt to .\\A330_labels\n",
      "Copied 0002985.txt to .\\A330_labels\n",
      "Copied 0002999.txt to .\\A330_labels\n",
      "Copied 0003000.txt to .\\A330_labels\n",
      "Copied 0003030.txt to .\\A330_labels\n",
      "Copied 0003037.txt to .\\A330_labels\n",
      "Copied 0003072.txt to .\\A330_labels\n",
      "Copied 0003080.txt to .\\A330_labels\n",
      "Copied 0003111.txt to .\\A330_labels\n",
      "Copied 0003121.txt to .\\A330_labels\n",
      "Copied 0003129.txt to .\\A330_labels\n",
      "Copied 0003131.txt to .\\A330_labels\n",
      "Copied 0003148.txt to .\\A330_labels\n",
      "Copied 0003232.txt to .\\A330_labels\n",
      "Copied 0003235.txt to .\\A330_labels\n",
      "Copied 0003290.txt to .\\A330_labels\n",
      "Copied 0003309.txt to .\\A330_labels\n",
      "Copied 0003316.txt to .\\A330_labels\n",
      "Copied 0003324.txt to .\\A330_labels\n",
      "Copied 0003338.txt to .\\A330_labels\n",
      "Copied 0003339.txt to .\\A330_labels\n",
      "Copied 0003351.txt to .\\A330_labels\n",
      "Copied 0003353.txt to .\\A330_labels\n",
      "Copied 0003355.txt to .\\A330_labels\n",
      "Copied 0003365.txt to .\\A330_labels\n",
      "Copied 0003373.txt to .\\A330_labels\n",
      "Copied 0003377.txt to .\\A330_labels\n",
      "Copied 0003382.txt to .\\A330_labels\n",
      "Copied 0003393.txt to .\\A330_labels\n",
      "Copied 0003394.txt to .\\A330_labels\n",
      "Copied 0003401.txt to .\\A330_labels\n",
      "Copied 0003440.txt to .\\A330_labels\n",
      "Copied 0003463.txt to .\\A330_labels\n",
      "Copied 0003508.txt to .\\A330_labels\n",
      "Copied 0003511.txt to .\\A330_labels\n",
      "Copied 0003515.txt to .\\A330_labels\n",
      "Copied 0003517.txt to .\\A330_labels\n",
      "Copied 0003535.txt to .\\A330_labels\n",
      "Copied 0003541.txt to .\\A330_labels\n",
      "Copied 0003544.txt to .\\A330_labels\n",
      "Copied 0003545.txt to .\\A330_labels\n",
      "Copied 0003555.txt to .\\A330_labels\n",
      "Copied 0003575.txt to .\\A330_labels\n",
      "Copied 0003614.txt to .\\A330_labels\n",
      "Copied 0003642.txt to .\\A330_labels\n",
      "Copied 0003643.txt to .\\A330_labels\n",
      "Copied 0003651.txt to .\\A330_labels\n",
      "Copied 0003668.txt to .\\A330_labels\n",
      "Copied 0003730.txt to .\\A330_labels\n",
      "Copied 0003787.txt to .\\A330_labels\n",
      "Copied 0003802.txt to .\\A330_labels\n",
      "Copied 0003817.txt to .\\A330_labels\n",
      "Copied 0003818.txt to .\\A330_labels\n",
      "Copied 0003853.txt to .\\A330_labels\n",
      "Copied 0003869.txt to .\\A330_labels\n",
      "Copied 0003881.txt to .\\A330_labels\n",
      "Copied 0003891.txt to .\\A330_labels\n",
      "Copied 0003922.txt to .\\A330_labels\n",
      "Copied 0003928.txt to .\\A330_labels\n",
      "Copied 0003933.txt to .\\A330_labels\n",
      "Copied 0003935.txt to .\\A330_labels\n",
      "Copied 0003938.txt to .\\A330_labels\n",
      "Copied 0003939.txt to .\\A330_labels\n",
      "Copied 0003961.txt to .\\A330_labels\n",
      "Copied 0003966.txt to .\\A330_labels\n",
      "Copied 0003971.txt to .\\A330_labels\n",
      "Copied 0004005.txt to .\\A330_labels\n",
      "Copied 0004006.txt to .\\A330_labels\n",
      "Copied 0004014.txt to .\\A330_labels\n",
      "Copied 0004020.txt to .\\A330_labels\n",
      "Copied 0004033.txt to .\\A330_labels\n",
      "Copied 0004061.txt to .\\A330_labels\n",
      "Copied 0004074.txt to .\\A330_labels\n",
      "Copied 0004076.txt to .\\A330_labels\n",
      "Copied 0004079.txt to .\\A330_labels\n",
      "Copied 0004093.txt to .\\A330_labels\n",
      "Copied 0004104.txt to .\\A330_labels\n",
      "Copied 0004107.txt to .\\A330_labels\n",
      "Copied 0004136.txt to .\\A330_labels\n",
      "Copied 0004141.txt to .\\A330_labels\n",
      "Copied 0004143.txt to .\\A330_labels\n",
      "Copied 0004171.txt to .\\A330_labels\n",
      "Copied 0004173.txt to .\\A330_labels\n",
      "Copied 0004183.txt to .\\A330_labels\n",
      "Copied 0004184.txt to .\\A330_labels\n",
      "Copied 0004209.txt to .\\A330_labels\n",
      "Copied 0004242.txt to .\\A330_labels\n",
      "Copied 0004254.txt to .\\A330_labels\n",
      "Copied 0004256.txt to .\\A330_labels\n",
      "Copied 0004282.txt to .\\A330_labels\n",
      "Copied 0004290.txt to .\\A330_labels\n",
      "Copied 0004315.txt to .\\A330_labels\n",
      "Copied 0004327.txt to .\\A330_labels\n",
      "Copied 0004348.txt to .\\A330_labels\n",
      "Copied 0004354.txt to .\\A330_labels\n",
      "Copied 0004365.txt to .\\A330_labels\n",
      "Copied 0004366.txt to .\\A330_labels\n"
     ]
    }
   ],
   "source": [
    "# 拷贝标注文件\n",
    "for filename in filtered_filenames_A330:\n",
    "    # 假设标注文件的扩展名为 .txt\n",
    "    annotation_filename = f\"{os.path.splitext(filename)[0]}.txt\"\n",
    "    annotation_source_path = os.path.join(src_label_root, annotation_filename)\n",
    "    annotation_target_path = os.path.join(A330_label_target_dir, annotation_filename)\n",
    "    if os.path.exists(annotation_source_path):\n",
    "        shutil.copy(annotation_source_path, annotation_target_path)\n",
    "        print(f\"Copied {annotation_filename} to {A330_label_target_dir}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "500ba3a7-8c1a-4cdc-87b7-6067c6e8c45d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c3f72c1a-0278-4555-a596-0e2aeff335cb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6b0f3807-874d-4765-9b3c-df0b12c9c84c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5cca8b73-b614-4587-8089-eb21122dabac",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "1ca5023a-9c20-49a1-9dd1-f0c980a89757",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(755,)\n"
     ]
    }
   ],
   "source": [
    "# 定义筛选条件\n",
    "def only_other_or_Boeing787(group):\n",
    "    return set(group['class']).issubset({'other', 'Boeing787'})\n",
    "\n",
    "# 应用筛选条件并获取符合条件的文件名\n",
    "filtered_filenames1 = remaining_df.groupby('filename').filter(only_other_or_Boeing787)['filename'].unique()\n",
    "\n",
    "# 打印结果\n",
    "print(filtered_filenames1.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "6fb518ec-10f0-4bb4-9fe1-b6b6b93efc3a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Remaining number of unique filenames: 2843\n"
     ]
    }
   ],
   "source": [
    "# 从 df_labels 中移除 filtered_filenames 对应的记录\n",
    "remaining_df1 = remaining_df[~remaining_df['filename'].isin(filtered_filenames1)]\n",
    "\n",
    "# 获取剩余的不同 filename 的数量\n",
    "remaining_filenames_count1 = remaining_df1['filename'].nunique()\n",
    "\n",
    "# 打印结果\n",
    "print(f\"Remaining number of unique filenames: {remaining_filenames_count1}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "9d899940-d760-4602-9cc7-4e891462c05e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "other        3315\n",
       "Boeing737    2557\n",
       "A220         2414\n",
       "A320/321     1771\n",
       "Boeing787    1307\n",
       "ARJ21        1187\n",
       "A330          309\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别ID的数量\n",
    "remaining_df1['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "ad314693-f6f8-42c8-aaa4-951c9dd3e567",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(523,)\n"
     ]
    }
   ],
   "source": [
    "# 定义筛选条件\n",
    "def only_other_or_Boeing737(group):\n",
    "    return set(group['class']).issubset({'other', 'Boeing737'})\n",
    "\n",
    "# 应用筛选条件并获取符合条件的文件名\n",
    "filtered_filenames2 = remaining_df1.groupby('filename').filter(only_other_or_Boeing737)['filename'].unique()\n",
    "\n",
    "# 打印结果\n",
    "print(filtered_filenames2.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "b745345c-4206-4f03-a2a3-2875b8a7d701",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Remaining number of unique filenames: 2843\n"
     ]
    }
   ],
   "source": [
    "# 从 df_labels 中移除 filtered_filenames 对应的记录\n",
    "remaining_df2 = remaining_df1[~remaining_df1['filename'].isin(filtered_filenames2)]\n",
    "\n",
    "# 获取剩余的不同 filename 的数量\n",
    "remaining_filenames_count2 = remaining_df1['filename'].nunique()\n",
    "\n",
    "# 打印结果\n",
    "print(f\"Remaining number of unique filenames: {remaining_filenames_count2}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "cd9cf7ed-6525-48ce-b04e-f75c643842a8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "other        3087\n",
       "A220         2414\n",
       "A320/321     1771\n",
       "Boeing737    1637\n",
       "Boeing787    1307\n",
       "ARJ21        1187\n",
       "A330          309\n",
       "Name: class, dtype: int64"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 每种类别ID的数量\n",
    "remaining_df2['class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "4da4410b-d9d1-4aa5-a287-3fd59fbc8186",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0,)\n"
     ]
    }
   ],
   "source": [
    "# 定义筛选条件\n",
    "def only_other_or_A220(group):\n",
    "    return set(group['class']).issubset({'other', 'A220'})\n",
    "\n",
    "# 应用筛选条件并获取符合条件的文件名\n",
    "filtered_filenames3 = remaining_df2.groupby('filename').filter(only_other_or_A220)['filename'].unique()\n",
    "\n",
    "# 打印结果\n",
    "print(filtered_filenames3.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "377968c8-24a8-463a-bdd3-b2f687158d5d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>filename</th>\n",
       "      <th>image_relative_path</th>\n",
       "      <th>image_width</th>\n",
       "      <th>image_height</th>\n",
       "      <th>class</th>\n",
       "      <th>cls_id</th>\n",
       "      <th>xmin</th>\n",
       "      <th>ymin</th>\n",
       "      <th>xmax</th>\n",
       "      <th>ymax</th>\n",
       "      <th>box_width</th>\n",
       "      <th>box_height</th>\n",
       "      <th>center_x</th>\n",
       "      <th>center_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>459</td>\n",
       "      <td>1433</td>\n",
       "      <td>536</td>\n",
       "      <td>1499</td>\n",
       "      <td>77</td>\n",
       "      <td>66</td>\n",
       "      <td>497.5</td>\n",
       "      <td>1466.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0000001.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000001.jpg</td>\n",
       "      <td>1500</td>\n",
       "      <td>1500</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>988</td>\n",
       "      <td>1426</td>\n",
       "      <td>1064</td>\n",
       "      <td>1499</td>\n",
       "      <td>76</td>\n",
       "      <td>73</td>\n",
       "      <td>1026.0</td>\n",
       "      <td>1462.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing787</td>\n",
       "      <td>5</td>\n",
       "      <td>713</td>\n",
       "      <td>777</td>\n",
       "      <td>772</td>\n",
       "      <td>829</td>\n",
       "      <td>59</td>\n",
       "      <td>52</td>\n",
       "      <td>742.5</td>\n",
       "      <td>803.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>1072</td>\n",
       "      <td>461</td>\n",
       "      <td>1153</td>\n",
       "      <td>545</td>\n",
       "      <td>81</td>\n",
       "      <td>84</td>\n",
       "      <td>1112.5</td>\n",
       "      <td>503.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0000002.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0000002.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>956</td>\n",
       "      <td>464</td>\n",
       "      <td>1038</td>\n",
       "      <td>555</td>\n",
       "      <td>82</td>\n",
       "      <td>91</td>\n",
       "      <td>997.0</td>\n",
       "      <td>509.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16458</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>Boeing737</td>\n",
       "      <td>4</td>\n",
       "      <td>123</td>\n",
       "      <td>354</td>\n",
       "      <td>189</td>\n",
       "      <td>408</td>\n",
       "      <td>66</td>\n",
       "      <td>54</td>\n",
       "      <td>156.0</td>\n",
       "      <td>381.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16459</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>242</td>\n",
       "      <td>334</td>\n",
       "      <td>313</td>\n",
       "      <td>408</td>\n",
       "      <td>71</td>\n",
       "      <td>74</td>\n",
       "      <td>277.5</td>\n",
       "      <td>371.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16460</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>344</td>\n",
       "      <td>342</td>\n",
       "      <td>425</td>\n",
       "      <td>416</td>\n",
       "      <td>81</td>\n",
       "      <td>74</td>\n",
       "      <td>384.5</td>\n",
       "      <td>379.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16461</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>565</td>\n",
       "      <td>301</td>\n",
       "      <td>645</td>\n",
       "      <td>364</td>\n",
       "      <td>80</td>\n",
       "      <td>63</td>\n",
       "      <td>605.0</td>\n",
       "      <td>332.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16462</th>\n",
       "      <td>0004368.jpg</td>\n",
       "      <td>.\\sar_aircraft_source\\JPEGImages\\0004368.jpg</td>\n",
       "      <td>1200</td>\n",
       "      <td>1200</td>\n",
       "      <td>A220</td>\n",
       "      <td>2</td>\n",
       "      <td>683</td>\n",
       "      <td>263</td>\n",
       "      <td>750</td>\n",
       "      <td>315</td>\n",
       "      <td>67</td>\n",
       "      <td>52</td>\n",
       "      <td>716.5</td>\n",
       "      <td>289.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>11712 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          filename                           image_relative_path  image_width  \\\n",
       "0      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "1      0000001.jpg  .\\sar_aircraft_source\\JPEGImages\\0000001.jpg         1500   \n",
       "2      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "3      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "4      0000002.jpg  .\\sar_aircraft_source\\JPEGImages\\0000002.jpg         1200   \n",
       "...            ...                                           ...          ...   \n",
       "16458  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16459  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16460  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16461  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "16462  0004368.jpg  .\\sar_aircraft_source\\JPEGImages\\0004368.jpg         1200   \n",
       "\n",
       "       image_height      class  cls_id  xmin  ymin  xmax  ymax  box_width  \\\n",
       "0              1500  Boeing787       5   459  1433   536  1499         77   \n",
       "1              1500  Boeing737       4   988  1426  1064  1499         76   \n",
       "2              1200  Boeing787       5   713   777   772   829         59   \n",
       "3              1200       A220       2  1072   461  1153   545         81   \n",
       "4              1200       A220       2   956   464  1038   555         82   \n",
       "...             ...        ...     ...   ...   ...   ...   ...        ...   \n",
       "16458          1200  Boeing737       4   123   354   189   408         66   \n",
       "16459          1200       A220       2   242   334   313   408         71   \n",
       "16460          1200       A220       2   344   342   425   416         81   \n",
       "16461          1200       A220       2   565   301   645   364         80   \n",
       "16462          1200       A220       2   683   263   750   315         67   \n",
       "\n",
       "       box_height  center_x  center_y  \n",
       "0              66     497.5    1466.0  \n",
       "1              73    1026.0    1462.5  \n",
       "2              52     742.5     803.0  \n",
       "3              84    1112.5     503.0  \n",
       "4              91     997.0     509.5  \n",
       "...           ...       ...       ...  \n",
       "16458          54     156.0     381.0  \n",
       "16459          74     277.5     371.0  \n",
       "16460          74     384.5     379.0  \n",
       "16461          63     605.0     332.5  \n",
       "16462          52     716.5     289.0  \n",
       "\n",
       "[11712 rows x 14 columns]"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "remaining_df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "81af9c74-3653-40ad-9c6c-8c79d065c612",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 保存到CSV文件\n",
    "remaining_df2.to_csv('labels_with_dimensions_and_cls_id_filtered_other.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f95b8ff2-c70c-4df6-a4b9-650c3d1387f0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "843c14df-1cdb-44ab-b38a-211862adb001",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set size: 8749\n",
      "Test set size: 2249\n",
      "Validation set size: 714\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 假设 df_labels 是已经加载好的DataFrame\n",
    "# 如果还没有加载数据，可以使用类似如下的代码来加载：\n",
    "# df_labels = pd.read_csv('path_to_your_file.csv')\n",
    "\n",
    "# 获取所有不同的 filename\n",
    "filenames = remaining_df2['filename'].unique()\n",
    "\n",
    "# 第一步：将数据分为训练集和其他（测试+验证）\n",
    "# 训练集占75%，其他占25%\n",
    "train_filenames, temp_filenames = train_test_split(filenames, test_size=0.25, random_state=42)\n",
    "\n",
    "# 第二步：将剩余的25%进一步划分为测试集（20%）和验证集（5%）\n",
    "# 测试集占80%（即总数据的20%），验证集占20%（即总数据的5%）\n",
    "test_filenames, val_filenames = train_test_split(temp_filenames, test_size=0.2, random_state=42)\n",
    "\n",
    "# 根据划分好的 filename 提取对应的记录\n",
    "train_df = df_labels[df_labels['filename'].isin(train_filenames)]\n",
    "test_df = df_labels[df_labels['filename'].isin(test_filenames)]\n",
    "val_df = df_labels[df_labels['filename'].isin(val_filenames)]\n",
    "\n",
    "# 打印结果\n",
    "print(\"Training set size:\", len(train_df))\n",
    "print(\"Test set size:\", len(test_df))\n",
    "print(\"Validation set size:\", len(val_df))\n",
    "\n",
    "# 保存到CSV文件（可选）\n",
    "train_df.to_csv('train_set.csv', index=False)\n",
    "test_df.to_csv('test_set.csv', index=False)\n",
    "val_df.to_csv('validation_set.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "c63ebf87-a4ba-4a47-8907-0353009980d1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2320,)"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "filenames.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "052c420c-f2cb-4087-b75e-cff1d414ae1a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1740,)"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_num = train_df['filename'].unique().shape\n",
    "train_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "f0497134-8fad-44a6-96f4-5950e481052e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(464,)"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_num = test_df['filename'].unique().shape\n",
    "test_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "597c859b-e070-464b-8f35-035b3b6dd283",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(116,)"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val_num = val_df['filename'].unique().shape\n",
    "val_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "5f200536-4900-406d-a488-a503c8db4a6e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2320"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "all_num = 1740 + 464 + 116\n",
    "all_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "26359979-f9fc-42b3-ac71-90b5824512fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "dataset_catetories = {\"train\": train_filenames, \"val\": test_filenames, \"test\": val_filenames}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "5f20e813-b356-4884-9639-aac0c4afc4ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "    创建 YOLO 数据集路径\n",
    "\"\"\"\n",
    "def create_target_directories(parent_dirs=[os.getcwd], sub_dirs=[\"train\", \"val\", \"test\"]):\n",
    "    \"\"\"\n",
    "        parent_dirs: 目标数据集保存路径，包括 images 和 labels\n",
    "        sub_dirs: 目标数据集子路径，包括 train, val 和 test\n",
    "    \"\"\"\n",
    "    failed_dirs = []\n",
    "    flag = True\n",
    "    for parent_dir in parent_dirs:\n",
    "        for _dir in sub_dirs:\n",
    "            target_dir = os.path.join(parent_dir, _dir)\n",
    "            if not os.path.exists(target_dir):\n",
    "                try:\n",
    "                    os.makedirs(target_dir)\n",
    "                except:\n",
    "                    failed_dirs.append(target_dir)\n",
    "                    flag = False\n",
    "    return flag, failed_dirs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "d99b69be-08a7-40cf-b23c-949084c3a931",
   "metadata": {},
   "outputs": [],
   "source": [
    "def copy_sdir_tdir(parent_dirs, sub_dirs):\n",
    "\n",
    "    flag, _ = create_target_directories(parent_dirs, sub_dirs)\n",
    "    if not flag:\n",
    "        print(f\"创建指定路径时出现异常，创建失败的路径是：\\n {_} \\n请检查并重试\")\n",
    "        return\n",
    "\n",
    "    import shutil\n",
    "    for key, data in dataset_catetories.items():\n",
    "        target_img_folder = os.path.join(target_img_root, key)\n",
    "        target_label_folder = os.path.join(target_label_root, key)\n",
    "        for file in data:\n",
    "            shutil.copy2(os.path.join(src_img_root, file), target_img_folder)\n",
    "            src_label_file = os.path.join(src_label_root, file[:file.rfind(\".\")] + \".txt\")\n",
    "            shutil.copy2(src_label_file, target_label_folder)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "fee65f99-d2a2-46b3-abd7-d78a09c1d5db",
   "metadata": {},
   "outputs": [],
   "source": [
    "parent_dirs = [target_img_root, target_label_root]\n",
    "sub_dirs = [\"train\", \"val\", \"test\"]\n",
    "copy_sdir_tdir(parent_dirs, sub_dirs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3c3dbd94-bacc-4407-94a9-1943edf6cadc",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
